Django 'url'模板标签错误

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参数。但是我肯定我错过了一些显而易见的东西,只是不确定是什么。

2个回答

7

是的,你说得对,django.contrib.auth.views.logout接受一个可选的"next_page"参数,但不要忘记"url"标签与urlconf模式匹配,而不是视图,因此它不知道视图中有什么参数。这表明您需要将"next_page"作为上述模式中的命名组,这是可以做到的,但有一种更简单的处理重定向的方法...

查看django.contrib.auth.views.logout,您会发现在没有"next_page"参数的情况下,该视图将重定向到请求.GET或请求.POST中提供的任何url,并使用键"redirect_field_name",该参数默认为"REDIRECT_FIELD_NAME",后者默认为字符串"next"。因此,保留您的urlconf方式,您可以在模板中执行以下操作:

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

非常感谢。不确定我是如何忽略REDIRECT_FIELD_NAME的。 - saturdayplace

5
基本上,Django的URL调度程序查看urlconf和参数,并说“我不知道在哪里放置这个参数”,因为它只查看urls指向的视图函数,而不是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"),

希望这有所帮助!

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接