django没有显示ValidationError

时间:2016-10-03 08:20:31

标签: django django-forms django-views

我遇到了一个问题:当我尝试使用未经过验证的信息登录时,页面只是刷新,没有任何反应。我的目标是弹出任何验证错误,但它们确实拒绝出现。你可以检查我的代码,并帮我找出该做什么。

模板

 <form method="post" action="">
    {% csrf_token %}
        {% bootstrap_form_errors form %}
        {% bootstrap_form form %}
        <input type="hidden" name="next" value="{{ request.path }}">
        <input type="submit" value="Войти">
    </form>

形式

class LoginForm(forms.ModelForm):
    username = forms.CharField()
    password = forms.CharField(widget=forms.PasswordInput)

    class Meta:
        model = CustomUser
        fields = ('username', 'password')

    def clean(self):
        username = self.cleaned_data.get('username')
        password = self.cleaned_data.get('password')
        if username is not None and password:
            user = authenticate(username=self.cleaned_data.get('username'), password=self.cleaned_data.get('password'))
            if user is None:
                raise ValidationError('Неверное имя пользователя или пароль')
        if username is None or password is None:
            raise ValidationError('Неверные данные')
        return self.cleaned_data

视图

class LoginView(FormView):
    form_class = LoginForm
    template_name = 'user/login.html'

    def get_success_url(self):
        return self.request.META.get('HTTP_REFERER')

    def get_context_data(self, **kwargs):
        ctx = super().get_context_data()
        ctx['form'] = self.form_class
        return ctx

    def form_valid(self, form):
        user = authenticate(username=form.cleaned_data.get('username'),
                            password=form.cleaned_data.get('password'))

        login(self.request, user)
        return super().form_valid(form)

    def dispatch(self, request, *args, **kwargs):
        if self.request.user.is_authenticated():
            return redirect('post-list')
        return super().dispatch(request, *args, **kwargs)
UPD:它不是靴子。当我使用默认表单时,没有validationErrors以及

1 个答案:

答案 0 :(得分:1)

您的问题在get_context_data,您传递的是表单类,而不是使用发布数据实例化的对象。

但是你根本不应该重写那个方法。即使你修复了这个问题,它也只会重复该方法的功能。完全删除该方法。