Как отобразить ValidationError в шаблоне Django?

Я новичок в Django, и прошу помощи у сообщества.

Сейчас я работаю над регистрацией пользователей и хочу сделать проверку пароля: если пароль не повторяется, то под нижним полем появляется сообщение. Насколько я понимаю, {{ form.errors }} должен использоваться для вывода текста ошибки, указанного в ValidationError, но когда эта ошибка возникает, ее текст не выводится на страницу. Подскажите, пожалуйста, как решить эту проблему. Возможно, я не совсем понял, как работают формы Django. Я пробовал решения, предложенные в других ответах, но, к сожалению, пока ничего не получилось. Спасибо.

forms.py:

from .models import CustomUser

class RegisterUserForm(forms.ModelForm):
    email = forms.EmailField(required=True,
                            label="Адрес электронной почты",
                            widget=forms.EmailInput(attrs={'class': 'form-control',
                                                        'placeholder':'email'}))
    password = forms.CharField(label='Пароль',
                            widget=forms.PasswordInput(attrs={'class': 'form-control',
                                                            'placeholder':'password'})                                                            )
    confirm_password = forms.CharField(label='Пароль(повторно)',
                            widget=forms.PasswordInput(attrs={'class': 'form-control',
                                                            'placeholder':'confirm password'}))


    def clean(self):
        super().clean()
        password = self.cleaned_data['password']
        confirm_password = self.cleaned_data['confirm_password']
        if password != confirm_password:
            raise ValidationError({'confirm_password': 'пароли не совпадают'})

views.py:

def sign_up(request):
    if request.method=="POST":
        form = RegisterUserForm(request.POST)
        if form.is_valid():
            form.save()
            return redirect('pages:index')

    form = RegisterUserForm()
    return render(request=request, template_name="users/sign_up.html", context={'form': form})

Шаблон:

</head>
    <link rel="stylesheet" type="text/css" href="{% static 'users/css/style.css' %}">
<head>

<div class="text-center log-in-bg rounded">
    <img class="mb-4" src="{% static "users/images/logo_sign_in.png" %}" alt="" width="72" height="72">
    <h1 class="h3 mb-3 font-weight-normal text-dark">РЕГИСТРАЦИЯ</h1>
    <form method="post" class="form-signin">
        {% csrf_token %}
        {{ form.email.label_tag }}
        {{ form.email }}
        {{ form.password }}
        {{ form.confirm_password }}
        {{ form.errors }}

        <button class="btn btn-lg btn-sign-in btn-block">Зарегистрироваться</button>
    </form>
</div>

Спасибо за помощь. Надеюсь, мой вопрос не слишком примитивен - я только в начале изучения Django, могу не знать некоторых вещей =)

Вариант 1)

Обычно ошибки валидации в clean() появляются в

{{ form.non_field_errors }} 

... потому что они не связаны с конкретным полем. В данном случае речь идет о двух полях. Если вы включите вышеуказанное в свой шаблон и измените сообщение об ошибке на...

raise ValidationError('пароли не совпадают')

...тогда ошибка должна появиться на вашей странице.

Вариант 2)

Присмотревшись внимательнее, я вижу, что вы пытались добавить это сообщение об ошибке для поля confirm_password. Хотя это не по умолчанию, если вы хотите обрабатывать это таким образом, вы можете удалить текущие строки raise ValidationError и использовать следующее в вашем методе clean, чтобы назначить ошибку определенному полю.

self.add_error('confirm_password', 'пароли не совпадают')

Ошибка была в представлении. Это исправленный вид:

def sign_up(request):
    if request.method=="POST":
        form = RegisterUserForm(request.POST)
        if form.is_valid():
            form.save()
            return redirect('pages:index')
    else:        
        form = RegisterUserForm()
    return render(request, template_name="users/sign_up.html", context={'form': form})

Я делал новый запрос к форме. И контекст с ошибками был очищен. Использование else помогло мне сохранить этот контекст. С другой стороны ответ SamSparx помог мне понять, как использовать add_error.

Вернуться на верх