Python by Example Book:不推荐使用url_patterns语法

时间:2018-01-06 23:13:28

标签: python django

在设置登录和退出网址模式时,这本书(我相信使用Django 1.8)引用:

from django.conf.urls import url
from . import views

url(r'^login/$', 'django.contrib.auth.views.login', name='login'),
url(r'^logout/$', 'django.contrib.auth.views.logout', name='logout'),
url(r'^logout-then-login/$','django.contrib.auth.views.logout_then_login',name='logout_then_login'),

其中login,logout和logout_then_login在相同的应用程序模板/帐户目录中具有相应的.html文件。但是,在Django 1.11上,这些错误包括:

“TypeError:在include()”

的情况下,view必须是可调用的或list / tuple

我认为是因为这个语法现在已经弃用了1.10及以上版本。尝试:

from django.conf.urls import url
from django.contrib.auth import views as auth_views
from . import views

url(r'^login/$', auth_views.LoginView.as_view(template_name='registration/login.html')),
url(r'^logout/$', auth_views.LogoutView.as_view(template_name='registration/logged_out.html')),
url(r'^logout-then-login/$', auth_views.LogoutThenLogin.as_view(template_name='logout_then_login.html')),

相反,但现在在我的主“base.html”代码中出现“无反向匹配”错误,位于:

<a href="{% url "login" %}">Log-in</a>

排队:

{% load staticfiles %}
<!DOCTYPE html>
<html>
<head>
    <title>{% block title %}{% endblock %}</title>
    <link href="{% static "css/base.css" %}" rel="stylesheet">
</head>
<body>
    <div id="header">
        <span class="logo">Bookmarks</span>
        {% if request.user.is_authenticated %}
        <ul class="menu">
            <li {% if section == "dashboard" %}class="selected"{% endif %}><a href="{% url "dashboard" %}">My dashboard</a></li>
            <li {% if section == "images" %}class="selected"{% endif %}><a href="#">Images</a></li>
            <li {% if section == "people" %}class="selected"{% endif %}><a href="#">People</a></li>
        </ul>
        {% endif %}

        <span class="user">
        {% if request.user.is_authenticated %}
            Hello {{ request.user.username }}, <a href="{% url "logout" %}">Logout</a>
        {% else %}
            <a href="{% url "login" %}">Log-in</a>
        {% endif %}
        </span>
    </div>

    <div id="content">
        {% block content %}
        {% endblock %}
    </div>
</body>
</html> 

之前在本书的早期版本的代码中没有出现过,该代码使用了指向的本地“login.html”视图:

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

并使用完全相同的HTML代码。 FWIW,我的项目settings.py文件设置为:

from django.core.urlresolvers import reverse_lazy

LOGIN_REDIRECT_URL = reverse_lazy('dashboard')  # redirect after login if no next parameter
LOGIN_URL = reverse_lazy('login')               # redirect to login if login_required decorator set
LOGOUT_URL = reverse_lazy('logout')             # redirect user to logout

为什么网址“登录”无法在此处反转?

1 个答案:

答案 0 :(得分:0)

是的丹尼尔100%正确。新语法中有命名空间,vis:

    url(r'^login/$', auth_views.LoginView.as_view(template_name='registration/login.html'), name='login'),
    url(r'^logout/$', auth_views.LogoutView.as_view(template_name='registration/logged_out.html'), name='logout'),

有了它,一切正常。谢谢。我会将此发布回发行商勘误表。