Вот довольно простое объяснение того, почему нельзя изменить представления на основе классов, не назвав их. Я не очень знаком с внутренностями Джанго, поэтому я счастлив, что меня поправили.
С функциональным представлением
# my_app.views.py
def my_view(request):
return HttpResponse("Hello, world!")
вы можете изменить my_app.views.my_view
, потому что это путь вызываемой функции просмотра.
С представлением на основе классов,
# my_app.views.py
class MyView(TemplateView):
template_name = "hello_world.html"
вы не можете повернуть вспять my_app.views.MyView
, потому что это не вызываемый объект просмотра. Вызываемое представление - MyView.as_view()
. Если вы присвоили MyView.as_view()
переменной в ваших представлениях следующим образом:
# my_app.views.py
class MyView(TemplateView):
template_name = "hello_world.html"
my_view = MyView.as_view()
# urls.py
url('^$', `my_view`),
тогда вы сможете изменить my_view
, не называя его. Этот параметр повторяет столько же, сколько и название вашего URL, поэтому я не думаю, что вам понравится!
Однако, когда вы вводите MyView.as_view()
непосредственно в шаблон URL, это анонимная функция. Он не был назначен какой-либо переменной, поэтому нет пути, который вы можете использовать, чтобы изменить его. Точно так же вы не сможете изменить следующее:
url('^$', lambda request: HttpResponse("Hello, World!")),
Обратите внимание, что url()
- это просто функция, упрощающая добавление именованных шаблонов URL. Если вы действительно не хотите называть свои URL-адреса, вы можете написать свою собственную функцию, которая автоматически генерирует имена для вас.