Django的.登录表单的错误消息

Wol*_*ter 17 forms django message login

我制作登录/密码表格:

模型:

class LoginForm(forms.Form):
username = forms.CharField(max_length=100)
password = forms.CharField(widget=forms.PasswordInput(render_value=False),max_length=100)
Run Code Online (Sandbox Code Playgroud)

视图:

def login_view(request):
    if request.method == 'POST':
        username = request.POST['email']
        password = request.POST['password']
        user = authenticate(username=username, password=password)
        if user is not None and user.is_active:
            login(request, user)
            return HttpResponseRedirect("/n1.html")# Redirect to a success page.
        return HttpResponseRedirect("/login")
    form=LoginForm()
    return render(request, 'enter.html', {'login_form': LoginForm})
Run Code Online (Sandbox Code Playgroud)

网址:

(r'^login/$', login_view),
Run Code Online (Sandbox Code Playgroud)

模板:

{% if form.errors %}
<p>Something is wrong</p>
{% endif %}

<form class="form-signin" action="" method="post">
    <h2 class="form-signin-heading">Login</h2>
    {% csrf_token %}

    <input class="input-block-level" type="text" name="email" value="" id="email" placeholder="Email">

    <input class="input-block-level" type="password" name="password" value="" id="username" placeholder="Password">

    <button class="btn btn-large btn-primary" type="submit">Login</button>
    <input type="hidden" name="next" value="{{next|escape}}" />

</form>
Run Code Online (Sandbox Code Playgroud)

我使用重定向登录页面然后登录或密码错误,但我想在这种情况下发出错误信息.为什么构造{%if form.errors%}不起作用?谢谢!

Jac*_*edd 50

因为表单不知道发生了错误.

在此处构建表单时:

form=LoginForm()
Run Code Online (Sandbox Code Playgroud)

你正在构建它而不传递任何信息.它不知道用户刚刚执行的POST,或者登录失败,或者密码丢失,或者错误是什么.

这是我的登录表单的样子:

class LoginForm(forms.Form):
    username = forms.CharField(max_length=255, required=True)
    password = forms.CharField(widget=forms.PasswordInput, required=True)

    def clean(self):
        username = self.cleaned_data.get('username')
        password = self.cleaned_data.get('password')
        user = authenticate(username=username, password=password)
        if not user or not user.is_active:
            raise forms.ValidationError("Sorry, that login was invalid. Please try again.")
        return self.cleaned_data

    def login(self, request):
        username = self.cleaned_data.get('username')
        password = self.cleaned_data.get('password')
        user = authenticate(username=username, password=password)
        return user
Run Code Online (Sandbox Code Playgroud)

我们覆盖表单的clean方法,因此如果表单通过验证,我们可以检查用户的凭据.我们还在表单对象本身上放置了一个登录方法,以使我们的视图更清晰.

接下来,在我们看来,我们想要这样做:

def login_view(request):
    form = LoginForm(request.POST or None)
    if request.POST and form.is_valid():
        user = form.login(request)
        if user:
            login(request, user)
            return HttpResponseRedirect("/n1.html")# Redirect to a success page.
    return render(request, 'enter.html', {'login_form': form })
Run Code Online (Sandbox Code Playgroud)

我们实例化表单并将请求交给它.POST进行检查.

如果我们有POST,我们检查表单是否有效.将调用表单的"干净"方法,并为我们检查用户凭据.

如果凭据失败,我们会引发错误,我们需要在模板中显示该错误.

表单引发的错误(但未附加到字段)存储在non_field_errors中,可以这样显示:

{% if form.non_field_errors %}
    <ul class='form-errors'>
        {% for error in form.non_field_errors %}
            <li>{{ error }}</li>
        {% endfor %}
    </ul>
{% endif %}
Run Code Online (Sandbox Code Playgroud)