Как настроить сообщение об ошибке проверки формы для поля подтверждения пароля

Я пытаюсь настроить сообщение об ошибке валидации формы для поля подтверждения пароля в форме создания пользователя.

Мой forms.py выглядит следующим образом.

from django.contrib.auth.forms import UserCreationForm
from django.core.exceptions import ValidationError
from .models import User

class CustomUserCreationForm(UserCreationForm):
    class Meta:
        model = User        
        fields = ('first_name','last_name','email','date_of_birth', 'gender', 'user_type', 'phone', 'address','photo', 'password1', 'password2' )
        error_messages = {
            field: {
                'required': f"{field.replace('_', ' ').title()} is required."
            }
            for field in fields
        }
        
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        for field_name in self.fields:
            self.fields[field_name].error_messages.update(self.Meta.error_messages[field_name])

Мой views.py выглядит следующим образом.

class UserRegisterView( FormView ):
    template_name = 'register.html'
    form_class = CustomUserCreationForm
    
    redirect_authenticated_user = True
    success_url = reverse_lazy('dashboard')      

    def form_valid( self, form ):
        user = form.save()
        if user is not None:
            login( self.request, user )
        return super( UserRegisterView, self ).form_valid( form )
    
    def get( self, *args, **kwargs ):
        if self.request.user.is_authenticated:
            return redirect('dashboard')
        return super( UserRegisterView, self ).get( *args, **kwargs )
    
    def form_invalid(self, form):
        return super(UserRegisterView, self).form_invalid(form)

Мой HTML-код выглядит следующим образом.

<label class="form-label">PassWord Confirmation</label>
<input type="password" class="form-control" name="password2" />                                
{% if form.password2.errors %}
    <div class="alert alert-danger">{{ form.password2.errors }}</div>
{% endif %}

Теперь я получаю сообщение о проверке Password2 is required.. Но я хотел бы получить сообщение о проверке Password Confirmation is required..

Вы можете переопределить значения по умолчанию для каждого поля для всех возможных сообщений об ошибках валидации, которые поддерживает форма. В вашем случае это будет:

error_messages = {
    'password2': {
        'required': "Password Confirmation is required.",
     },
}

Если вы хотите, чтобы это было динамично, вы можете создать отображение, где ключом будет ваше поле, а значением - другое отображение с определенными сообщениями об ошибках для каждого случая проверки.

field_message__map = {
    'password2': {
        'required': "Password Confirmation is required.",
     },
    'password1': {
        'required': "Password is required.",
     },
}

И затем вы должны использовать его в определении формы

error_messages = {
    field: field_message__map[field] for field in fields
}

Я думаю, что в ваших представлениях и html нет ошибок. ИТАК,

полный forms.py с пользовательским сообщением об ошибке:

from django.contrib.auth.forms import UserCreationForm
from django.core.exceptions import ValidationError
from .models import User

class CustomUserCreationForm(UserCreationForm):
    class Meta:
        model = User        
        fields = (
            'first_name', 'last_name', 'email', 'date_of_birth', 
            'gender', 'user_type', 'phone', 'address', 'photo', 
            'password1', 'password2'
        )
         # Override the error message for password2
        error_messages = {
            field: {
                'required': f"{field.replace('_', ' ').title()} is required."
            }
            for field in fields
        }
        error_messages['password2'] = {
            'required': "Password Confirmation is required."
        }
        
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        for field_name in self.fields:
            self.fields[field_name].error_messages.update(self.Meta.error_messages.get(field_name, {}))

Явно задав требуемое сообщение об ошибке для поля password2 в словаре error_messages, вы можете обеспечить отображение Password Confirmation is required., когда поле не заполнено.

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