Ошибка тега шаблона django 'url'

Мой URLconf содержит этот шаблон:

url(r'^accounts/logout/$','django.contrib.auth.views.logout', name="logout"),

И я пытаюсь изменить это в шаблоне с тегом URL следующим образом:

<a href="{% url logout next_page=request.path %}">logout</a>

Но я продолжаю получать следующую ошибку:

Reverse for 'logout' with arguments '()' and keyword arguments '{'next_page': u'/first-page/child/'}' not found

Я думал, что django.contrib.auth.views.logout должен принимать параметр option next_page. Я уверен, что упускаю что-то очевидное, но я не уверен, что это такое.


person saturdayplace    schedule 03.09.2009    source источник


Ответы (2)


Да, вы правы, django.contrib.auth.views.logout принимает необязательный параметр «next_page», но не забывайте, что тег «url» соответствует шаблонам urlconf, а не представлениям, поэтому он не знает, что такое или не является параметром представления. Таким образом, это говорит о том, что вам нужно сделать "next_page" именованной группой в регулярном выражении для приведенного выше шаблона, что вы могли бы сделать, но есть более простой способ обработки перенаправлений...

Глядя на django.contrib.auth.views. logout, вы можете видеть, что при отсутствии параметра "next_page" представление перенаправляется на любой URL-адрес, предоставленный либо в request.GET, либо в request.POST с ключом "redirect_field_name", параметр, который по умолчанию равен " REDIRECT_FIELD_NAME», которое, в свою очередь, по умолчанию соответствует строке «далее». Итак, оставив ваш urlconf таким, какой он есть, вы можете сделать что-то вроде этого в своем шаблоне:

<a href='{% url logout %}?next={{ request.path }}'>logout</a>
person ozan    schedule 03.09.2009
comment
Очень признателен. Не знаю, как я проглядел REDIRECT_FIELD_NAME. - person saturdayplace; 03.09.2009

По сути, диспетчер URL-адресов Django просматривает urlconf и этот аргумент и говорит: «Я не знаю, куда поместить этот аргумент», потому что он не смотрит на функции представления, на которые указывают URL-адреса, а только urlconf и шаблоны в нем.

Прямо сейчас в вашем шаблоне URL нет места для этого аргумента.

то есть вы можете вызвать django.contrib.auth.views.logout с дополнительными аргументами, если вы напишете для него свой собственный шаблон или если вы вызовете его из своего собственного представления, но не из шаблона URL-адреса по умолчанию.

Вам может подойти один из этих шаблонов URL (не проверено):

url(r'^accounts/logout/(?P<next_page>.*)?$','django.contrib.auth.views.logout', name="logout"),
url(r'^accounts/logout/$','django.contrib.auth.views.logout', kwargs={'next_page':None}, name="logout"),

Надеюсь, это поможет!

person Gabriel Hurley    schedule 03.09.2009