Вопрос

Мой 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 предполагается, что нужно выбрать вариант next_page параметр.Я уверен, что упускаю что-то очевидное, но я не уверен, что это такое.

Это было полезно?

Решение

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

Глядя на django.contrib.auth.views.выход из системы, вы можете видеть, что при отсутствии параметра "next_page" просмотр перенаправляется на любой URL, указанный в любом запросе.GET или request .ОТПРАВЬТЕ сообщение с ключом "redirect_field_name", параметром, который по умолчанию равен "REDIRECT_FIELD_NAME", который, в свою очередь, по умолчанию равен строке "next".Таким образом, оставив ваш urlconf таким, какой он есть, вы можете сделать что-то подобное в своем шаблоне:

<a href='{% url logout %}?next={{ request.path }}'>logout</a>

Другие советы

По сути, диспетчер 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"),

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top