9

我的 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参数。我确定我遗漏了一些明显的东西,但我不确定它是什么。

4

2 回答 2

7

是的,你是对的,django.contrib.auth.views.logout 确实接受一个可选的“next_page”参数,但不要忘记“url”标签匹配 urlconf 模式,而不是视图,所以它不知道什么是或者不是视图的参数。因此,这表明您需要在上述模式的正则表达式中将“next_page”设为命名组,您可以这样做,但有一种更简单的方法来处理重定向......

查看django.contrib.auth.views.logout,您可以看到在没有“next_page”参数的情况下,视图重定向到 request.GET 或 request.POST 中提供的任何 url,键为“redirect_field_name”,默认为“REDIRECT_FIELD_NAME”的参数,该参数又默认为字符串“next”。所以让你的 urlconf 保持原样,你可以在你的模板中做这样的事情:

<a href='{% url logout %}?next={{ request.path }}'>logout</a>
于 2009-09-03T00:29:57.533 回答
5

基本上,Django 的 URL 调度程序正在查看 urlconf 和那个参数并说“我不知道把这个参数放在哪里”,因为它不查看 url 指向的视图函数,只查看 urlconf 和其中的模式。

现在,您的 url 模式中没有该参数的位置。

即,如果您为它编写自己的模式或者从您自己的视图调用它,而不是从其默认的 url 模式调用,您可以使用额外的参数调用 django.contrib.auth.views.logout。

这些 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"),

希望有帮助!

于 2009-09-03T00:23:20.603 回答