我使用的是默认的django身份验证系统,几乎没有自定义。登录和注销的核心功能按预期工作。问题出在我的登录表单模板中的以下代码片段上:
{% if next %}
<p>Please login to see this page.</p>
{% endif %}
这是根据官方文档中提供的示例登录视图改编的。这个想法是,如果用户尝试在不登录的情况下访问受保护的页面,他/她将被重定向到登录页面,并且next
参数设置为受保护页面的 url。这工作正常。
但是,当用户单击登录 URL 并直接导航到登录 URL 时,不应显示上述错误消息。但在这种情况下,next
参数被设置为来自settings.py
的LOGIN_REDIRECT_URL
,并且我们看到此错误消息。
我尝试调试以找到问题所在,并在django.contrib.auth.views.LoginView
课堂上找到了它。此类有一个方法get_success_url
,该方法从next
参数或LOGIN_REDIRECT_URL
获取重定向 url。此方法用于填充方法get_context_data
中登录表单的上下文,我认为这是不正确的。dispatch
方法还使用get_success_url
来获取重定向 URL,这是正确的,因为目的是实际重定向。
我不确定我的解释是否清楚,如果不是,请告诉我。有解决方法吗?我应该为此提交错误报告吗?
用:
- Python: 3.6 (Anaconda3, 64 bit)
- 姜戈:1.11.1
- 姜戈注册:2.2
提出了 Django 错误 https://code.djangoproject.com/ticket/28229。
这不是解决方案,而更像是一种解决方法:
假设您的LOGIN_REDIRECT_URL
设置为/
,您可以编写{% if next != "/" %}
而不是{% if next %}
。