如何在模板中正确获取登录视图的URL?

时间:2015-12-21 11:43:39

标签: python django django-templates

我有一个小问题,弄清楚{% url 'something' %}在django模板中是如何工作的。

当我在调试模式下运行我的网站时,我在stdout中看到了这个:

web_1 | [21/Dec/2015 11:29:45] "GET /accounts/profile HTTP/1.1" 302 0
web_1 | /usr/local/lib/python3.5/site-packages/django/template/defaulttags.py:499: RemovedInDjango110Warning: Reversing by dotted path is deprecated (django.contrib.auth.views.login).
web_1 |   url = reverse(view_name, args=args, kwargs=kwargs, current_app=current_app)
web_1 | 

/ accounts /个人资料会映射到模板,此模板中提及django.contrib.auth.views.login的唯一位置如下:

<a href="{% url 'django.contrib.auth.views.logout' %}?next={% url 'django.contrib.auth.views.login' %}">Log out</a>

所以,我想由于某些原因,这不是使用{%url%}命令的正确方法。什么是正确的方法?如何摆脱这种警告?

以下是我的网址:

urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'^accounts/', include('django.contrib.auth.urls')),
    url(r'^accounts/profile', views.profile_view),
    url(r'^$', RedirectView.as_view(url=reverse_lazy(views.profile_view)))
]

3 个答案:

答案 0 :(得分:7)

您应该使用网址的名称,而不是其虚线路径。

在这种情况下,您已添加django.contrib.auth.urls的网址格式。如果您查看that urls file,则可以看到视图的名称为loginlogout

urlpatterns = [
    url(r'^login/$', views.login, name='login'),
    url(r'^logout/$', views.logout, name='logout'),
    ...
]

因此,请将您的链接更改为:

<a href="{% url 'logout' %}?next={% url 'login' %}">Log out</a>

答案 1 :(得分:1)

看一看 urls.py

url(r'^login/$', views.login, name='login'),

您可以在使用网址时引用该名称

{% url 'login' %}

{% url 'logout' %}

或者如果你需要在下一次注销

<a href="{% url logout %}?next=/accounts/login/">Logout</a>

查看这篇文章 'django.contrib.auth.views.login'

答案 2 :(得分:0)

urls.py中为每个相关条目添加名称(不包括包含其他定义的条目,因为名称将被忽略)

urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'^accounts/', include('django.contrib.auth.urls')),
    url(r'^accounts/profile', views.profile_view, name='acc_profile'),
    url(r'^$', RedirectView.as_view(url=reverse_lazy(views.profile_view)), name='home')
]

然后在模板中使用url条目的名称,如上所定义,即

<a href="{% url 'optional_template_namespace:entry_name' %}">The link text</a>

在给定的情况下,loginlogout网址来自标准django.contrib.auth.urls,其名称很简单(有关详细信息,请参阅here

<a href="{% url 'logout' %}?next={% url 'login' %}">Log out</a>