Django:登录页面中的下一个值发生了奇怪的变化

Posted

技术标签:

【中文标题】Django:登录页面中的下一个值发生了奇怪的变化【英文标题】:Django: Next value is changing oddly in login page 【发布时间】:2012-05-24 21:52:00 【问题描述】:

如果我的应用中的用户已经登录并尝试直接转到“../login/”,我想将他们重定向到他们的用户页面。我找到了这个答案:

Django: Redirect logged in users from login page

在我决定点击登录字段下方的“注册”链接之前,它的效果非常好。我不知道为什么,但是当我点击它时,我再次重定向到登录页面,但唯一改变的是 url,由于某种原因它变成了“http://localhost:8000/users/login/?next=/users/register/”,它不会带我到我的注册页面.

如果我在登录模板中使用另一个 url 设置“下一个”变量,为什么会发生变化:

% extends "base.html" %
    % block title %User Login% endblock %
    % block head %User Login% endblock %
    % block content %
        % if form.errors %
            <p>User name or password is incorrect.</p>
        % endif %
        <form method="post" action="% url login %">
            % csrf_token %
            <p><label for="id_username">Username:</label>
                 form.username </p>
            <p><label for="id_password">Password:</label>
                 form.password </p>
            <input type="submit" value="Login" />
            <input type="hidden" name="next" value="users/"/>
        </form>
            <li><a href="/users/register/">Register</a></li>
    % endblock %

我正在使用 django1.4 和 python 2.7。我的 urls.py 是:

对于整个应用程序:

urlpatterns = patterns('',
    url(r'^$', main_page, name="main_page"),
    url(r'^users/',include('user_manager.urls')),
)

对于 user_manager 模块:

urlpatterns = patterns('user_manager.views',
    url(r'^$', users, name="user_page"),
    url(r'^logout/$', user_logout, name="logout"),
    url(r'^login/$', user_login, name="login"),
    url(r'^(\w+)/$', user_page),
    url(r'^register/$', register_page),
)

【问题讨论】:

不登录可以直接访问http://localhost:8000/users/register/吗? @dgel 实际上......不。直到现在我才意识到这一点。但我也不知道为什么。无论如何,当我单击链接时,为什么下一个令牌会获得“/users/register”值? 【参考方案1】:

register_page 视图上有 @login_required 装饰器吗?如果是这样,请将其删除

【讨论】:

【参考方案2】:

好的,我找到了问题所在。 Django 按顺序检查 urls 正则表达式,因此“注册”url 匹配用于用户页面的“(\w+)/”。所以我所要做的就是把那个 url 放在最后,urls.py 现在看起来像这样:

urlpatterns = patterns('user_manager.views',
    url(r'^$', users, name="user_page"),
    url(r'^logout/$', user_logout, name="logout"),
    url(r'^login/$', user_login, name="login"),
    url(r'^register/$', register_page),
    url(r'^(\w+)/$', user_page),
)

尽管如此,我仍然不太明白为什么那个错误的匹配会改变下一个值。我知道这是导致它的原因,但我不知道为什么......

非常感谢您的宝贵时间!

【讨论】:

以上是关于Django:登录页面中的下一个值发生了奇怪的变化的主要内容,如果未能解决你的问题,请参考以下文章

在不重新加载页面的情况下更新 Django 中的表单值?

在调用期间,mockgen 的返回方法中的预期值发生了变化

NumPy数组元素在选中时会发生奇怪的变化

当 vuex 商店的值发生变化时,如何更新组件中的状态?

重定向到 django FormView 中的下一个 URL

jsp 的session为啥会变化