在我的模板login.html
中,我有:
{% if form.errors %}
{% if user.is_authenticated %}
<div class="alert alert-warning"><center>Your account doesn't have access to this utility.</center></div>
{% else %}
<div class="alert alert-warning"><center>Incorrect username or password!</center></div>
{% endif %}
{% endif %}
我要做的是,如果在表单提交后,用户处于非活动状态,则显示不同的错误消息,如果用户未经过身份验证,则显示不正确的用户名密码错误消息。这不起作用。它始终显示&#34;不正确的用户名或密码!&#34;在这两种情况下。但是在视图中,即使对于非活动用户,user.is_authenticated也会返回True
。
我还有其他方法可以完成这项工作吗?我也试过
{% if 'inactive' in form.errors %}
但这也不起作用,即使我尝试打印form.errors
时,它会显示文字&#34;此帐户处于无效状态&#34;对于不活跃的用户。
编辑: 对于视图,我只是在自定义登录视图中使用django的登录视图
views.py:
from django.contrib.auth.views import login, logout
from django.shortcuts import render, redirect
def custom_login(request, **kwargs):
if request.user.is_authenticated():
return redirect('/homepage/')
else:
return login(request, **kwargs)
答案 0 :(得分:2)
您的登录模板中没有任何点检查{% if user.is_authenticated %}
。如果用户已通过身份验证,那么您的custom_login
视图会将其重定向到主页。
如果帐户处于非活动状态,则表单无效,用户将无法登录。表单的错误将如下所示:
{'__all__': [u'This account is inactive.']}
因此,检查{% if 'inactive' in form.errors %}
将不起作用,因为错误与密钥__all__
一起存储,而不是inactive
。
你可以做{% if 'This account is inactive.' in form.non_field_errors %}
但这非常脆弱,如果Django改变了非活动用户的错误消息文本,它会破坏。
最好显示实际错误,而不是试图找出它在模板中的错误类型。显示非字段错误的最简单方法是包括:
{{ form.non_field_errors }}
或者,如果您需要更多控制权:
{% for error in form.non_field_errors %}
{{ error }}
{% endfor %}
如果您需要更改非活动用户的错误消息,可以将认证表单子类化,然后在登录视图中使用该表单。
my_error_messages = AuthenticationForm.error_messages.copy()
my_error_messages['inactive'] = 'My custom message'
class MyAuthenticationForm(AuthenticationForm):
error_messages = my_error_messages
答案 1 :(得分:1)
只是为了补充Alasdair非常明智的答案,如果您真的希望明确检查用户是否存在但是处于非活动状态,您可以使用AuthenticationForm.get_user()
,即:
{% if form.errors %}
{% with form.get_user as user %}
{% if user %}
{# the user is inactive #}
{% else %}
{# no user matching username/password #}
{% endif %}
{% endwith %}
{% endif %}
这假设您使用的是默认django.contrib.auth.forms.AuthenticationForm
- 您可以使用自己的confirm_login_allowed()
来实施自己的政策。