登录页面不显示失效消息

时间:2015-07-30 11:45:55

标签: django django-forms django-views django-authentication

forms.py:

from django import forms
from django.contrib.auth import authenticate, get_user_model, login
from django.contrib.auth.models import User
from django.forms import ModelForm
from django.utils.text import capfirst
from .models import Classname, Sectionname, Teachername, Attendancename

class AuthenticationForm(forms.Form):
    username = forms.CharField(max_length=20)
    password = forms.CharField(widget=forms.PasswordInput)
    error_messages = {
        'invalid_login': ("Please enter a correct %(username)s and password."
                          "Note that both fields may be case-sensitive."),
        'inactive': ("This account is inactive"),
    }

    def clean(self):
        username = self.cleaned_data.get('username')
        password = self.cleaned_data.get('password')

        if username and password:
            self.user_cache = authenticate(username=username, password=password)

            if self.user_cache is None:
                raise forms.ValidationError(
                    self.error_messages['invalid_login'],
                    code='invalid_login',
                )

        return self.cleaned_data

    def confirm_login_allowed(self, request):
        if self.user_cache.is_active:
            login(request, self.user_cache)
        else:
            raise forms.ValidationError(
                self.error_messages['inactive'],
                code='inactive',
                )

    def get_user_id(self):
        if self.user_cache:
            return self.user_cache.id
        return None

    def get_user(self):
        return self.user_cache

views.py:

def user_login(request):
    if request.method == 'POST':

        form = AuthenticationForm(request.POST)

        if form.is_valid():
            form.confirm_login_allowed(request)
            return HttpResponseRedirect(reverse('student:mains'))
        else:
            print(form.errors)
    else:
        form = AuthenticationForm()
    return render(request, 'login.html', {'form': form},)

我的模板:

<!DOCTYPE html>
<html>
    <head>
        <!-- Is anyone getting tired of repeatedly entering the header over and over?? -->
        <title>Login</title>
    </head>

    <body>
        <h1>Login to Mysite</h1>

        <form id="login_form" method="post">
            {% csrf_token %}
            Username: <input type="text" name="username" value="" size="50" />
            <br />
            Password: <input type="password" name="password" value="" size="50" />
            <br />
            <br>
            <input type="submit" value="submit" />
        </form>

    </body>
</html>

我正在研究django-auth表单和视图,并尝试在我当前的小应用程序上实现。一切正常,除非我提供不正确的凭据,然后表单不会引发任何错误。

尽管如此,它仍然在相同的登录页面上没有任何适当的消息。

但是,我已在表单的'raise ValidatonError'方法中定义了'confirm_login_allowed',在我的视图中也定义了'print(form.errors)'

我不知道为什么它没有显示适当的消息。

任何人都可以知道我在哪里做错了吗?

谢谢!提前.....

1 个答案:

答案 0 :(得分:0)

看起来你从未在模板中使用{'form':form},而是选择手动构建两个输入。这实际上可以启动您在身份验证方面所需的所有后端进程,因为您已将每个表单元素的名称值分配为与AuthenticationForm中的变量(即用户名,密码)相对应。所以一切都在POST上有效。但是在GET上,你实际上从未使用过form.error_message,因此没有地方可以显示它,即使它被分配了一个值。

相关问题