TLDR:<input type="hidden" name="next" value="{{ next }}">
是我不明白的代码行。有了它,这个重定向系统就可以正常工作,但是,我不知道它在做什么。好像是在将用户链接到下一页,但实际上没有单击链接?
我了解到,如果未登录用户,则使用next
参数将用户重定向到他们登录后尝试访问的任何装饰@login_required
的视图。有点不可思议。
我具有以下与登录相关的设置:
LOGIN_REDIRECT_URL = 'dashboard' # tells django which url to redirect after login if no 'next' parameter is present in the request
LOGIN_URL = 'login' # url to redirect the user to log in (for example, views using the login_required decorator)
并且正在使用django.contrib.auth
中提供的身份验证视图(为简单起见仅包括三个视图):
from django.urls import path
from . import views
from django.contrib.auth import views as auth_views
urlpatterns = [
path('', views.dashboard, name = 'dashboard'),
path('login/', auth_views.LoginView.as_view(), name = 'login'),
path('password_change/', auth_views.PasswordChangeView.as_view(), name = 'password_change'),
]
这是位于account / registration / index.html的自定义login.html模板:
<div class="login-form">
<form action="{% url 'login' %}" method="post">
{{ form.as_p }}
{% csrf_token %}
<input type="hidden" name="next" value="{{ next }}">
<input type="submit" name="" value="Log-in">
</form>
</div>
现在说我尚未登录并尝试访问/account/password_change
,将被重定向到login
视图,并且路径将为http://127.0.0.1:8000/account/login/?next=/account/password_change/
,登录后,我可以更改我的密码没有问题。但是,如果我从index.html中删除<input type="hidden" name="next" value="{{ next }}">
:
<div class="login-form">
<form action="{% url 'login' %}" method="post">
{{ form.as_p }}
{% csrf_token %}
<input type="submit" name="" value="Log-in">
</form>
</div>
,然后再次尝试访问/account/change_password
(作为非登录用户),我将被重定向到登录页面,并且该URL与之前的http://127.0.0.1:8000/account/login/?next=/account/password_change/
相同。但是,这次登录时,我被重定向到dashboard
视图(这对我来说很有意义,我使用LOGIN_REDIRECT_URL = 'dashboard'
定义了此视图,但未提供next
参数。
说了这么多,我不明白的是为什么删除<input type="hidden" name="next" value="{{ next }}">
之后是login
视图下边http://127.0.0.1:8000/account/login/?next=/account/password_change/
的路径(即使我将重定向到{{ 1}},而不是dashboard
)?为什么将password_change
添加回html之后,浏览器是否知道如何将用户重定向到正确的页面?
如果有人花时间阅读并回复此问题,请先感谢!
答案 0 :(得分:1)
好问题。 请阅读此代码段 https://github.com/django/django/blob/master/django/contrib/auth/views.py#L71
如果您仔细观察,这行代码将尝试从POST
获取数据,其名称为next
。如果没有名为next
的键,它将尝试从查询参数获取值;我是说GET。
因此,如果我们从表单(<input type="hidden" name="next" value="{{ next }}">
)中删除输入,它仍然可以用作查询参数的备用。
希望,它会有所帮助。