2012-04-19 1 views
0

Я пытаюсь перейти к классам в Django после обновления, и у меня есть два вопроса относительно этого. Это мой код, упрощена:Проблемы при изменении представлений класса в Django

# urls.py 

urlpatterns += patterns('project.app.views', 
    ('^$', 'index'), # Old style 
    url(r'^test/$', SearchView.as_view()), # New style 
) 


# views.py 

class SearchView(TemplateView): 
    template_name = 'search.html' 

    def get_context_data(self, **kwargs): 
     messages.success(request, 'test') 
     return {'search_string': 'Test'} 

Когда я запускаю это я первый получаю ошибку name 'SearchView' is not defined. Кто-нибудь знает, почему?

Попытка пропустить, что я добавляю from project.app.views import SearchView, который является уродливым, а не тем, как я хочу, чтобы он работал, но эй, я стараюсь посмотреть, смогу ли я заставить остальных работать. Затем я получаю global name 'request' is not defined из-за messages. Это имеет смысл, но как мне получить объект запроса здесь?

Так что я хотел бы знать: как мне заставить представления работать по назначению и как использовать сообщения в get_context_data()?

ответ

1

Вы видите name 'SearchView' is not defined, потому что вы не импортировали SearchView в свой urls.py. Если вы считаете это уродливым, вы можете сделать search = SearchView.as_view() в своем views.py и использовать старый стиль для ссылки на вид как search. Запрос можно получить по адресу self.request для добавления сообщений. Обновленный исходный пример приведен ниже.

# views.py 
class SearchView(TemplateView): 
    template_name = 'search.html' 

    def get_context_data(self, **kwargs): 
     messages.success(self.request, 'test') 
     return {'search_string': 'Test'} 

search = SearchView.as_view() 

# urls.py 
urlpatterns += patterns('project.app.views', 
    url('^$', 'index'), # Old style 
    url(r'^test/$', 'search'), # New style 
) 
+0

Спасибо, я, должно быть, пропустил этот запрос сам. Я думал, что Django найдет мой класс SearchView из «project.app.views» в шаблонах, как и со старыми функциями стиля. Мне кажется странным, что это не так. – olofom

+0

Без импорта ваш оригинальный 'urls.py' недействителен Python. Не много Джанго может это сделать. –

0

Задайте один вопрос одновременно (руководство StackOverflow).

В любом случае:

  • Это способ вид класса на основе предназначены для работы. Магии автоматического импорта не существует, вы просто импортируете класс и используете его метод as_view().
  • Вы можете получить доступ к объекту запроса в своем классе вида через self.request.
+3

Первое правильное, но второе - нет. Все представления на основе классов устанавливают запрос как 'self.request', к которому можно получить доступ из любого места, включая' get_context_data'. Вы не должны переопределять 'dispatch', если вам действительно не нужно менять функциональность отправки. –

+0

Вы, сэр, верны. Будет исправлено как можно скорее :) – Dor