Max Montana
Max Montana

Reputation: 55

django doesn't show ValidationError

I have a problem: when i try to login with information that doesn't get validated, the page is just refreshes, and nothing happens. My goal is to pop up any validation error, but they literally refuse to appear. Could you please check my code, and help me to find out what to do.

template

 <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>

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

view

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: It's not bootsrap. When i use the default forms, there are no validationErrors aswell

Upvotes: 0

Views: 112

Answers (1)

Daniel Roseman
Daniel Roseman

Reputation: 599600

Your problem is in get_context_data, where you pass the form class, rather than the object instantiated with the post data.

However you should not be overriding that method at all. Even if you fixed this issue, it would only be duplicating what the method already does. Remove the method altogether.

Upvotes: 1

Related Questions