Почему ошибка моей формы не отображается в шаблоне?

#django #forms #validation

#django #формы #проверка

Вопрос:

У меня есть форма входа пользователя

 class PersonLoginForm(forms.Form):
    username = forms.CharField(max_length=20, required=True)
    password = forms.CharField(max_length=100, required=True)

    def clean_password(self):
        user = Person.objects.get(username=self.cleaned_data['username'])
        if not user.check_password(self.cleaned_data['password']):
            self.add_error('password', 'That password is incorrect!')
        return self.cleaned_data
  

Там я проверяю, правильный ли пароль, чтобы в шаблоне могло появиться сообщение об ошибке
Я получаю доступ к сообщению об ошибке в моем шаблоне следующим образом

 <div class="field-wrapper">
     {% render_field form.password.errors %}
     {% render_field form.password.label_tag %}
     {% render_field form.password placeholder='password...' type='password'%}
</div>
  

но сообщение об ошибке не отображается!
Это представление для формы входа в систему

 def user_login(request):
    if request.method == 'POST':
        form = PersonLoginForm(request.POST)
        if form.is_valid():
            username = form.cleaned_data['username']
            password = form.cleaned_data['password']
            user = authenticate(username=username, password=password)
            if user is not None:
                login(request, user)
                messages.success(request, 'Successfully logged in!')
                return redirect('all_users')
        print(form.errors)

    form = PersonLoginForm()
    context = {
        'form': form,
        'title': 'Login',
    }
    return render(request, 'index/login.html', context)
  

Я печатаю его после form.is_valid() вычисления False

 <ul class="errorlist"><li>password<ul class="errorlist"><li>That password is incorrect!</li></ul></li></ul>
  

Она даже не отображается в шаблоне

Ответ №1:

Что вы можете сделать, это добавить эту новую форму form = PersonLoginForm() в оператор else, когда ваш метод запроса GET продолжает иметь пустую форму. Добавляя оператор else, вы избегаете нового назначения формы; после процесса проверки он перейдет к render(request, ….) с экземпляром формы, содержащим все ошибки проверки

 def user_login(request):
if request.method == 'POST':
    form = PersonLoginForm(request.POST)
    if form.is_valid():
        username = form.cleaned_data['username']
        password = form.cleaned_data['password']
        user = authenticate(username=username, password=password)
        if user is not None:
            login(request, user)
            messages.success(request, 'Successfully logged in!')
            return redirect('all_users')
    print(form.errors)

else:
    form = PersonLoginForm()
context = {
    'form': form,
    'title': 'Login',
}
return render(request, 'index/login.html', context)