Django не выводит ошибку валидации пользовательского валидатора формы
Итак, у меня есть следующая форма
class SignUpForm(UserCreationForm):
email = forms.EmailField(required=True, widget=forms.EmailInput(attrs={
'class': tailwind_class
}))
password1 = forms.CharField(label='Password', widget=forms.PasswordInput(attrs={'class': tailwind_class}))
password2 = forms.CharField(label='Confirm Password', widget=forms.PasswordInput(attrs={'class': tailwind_class}))
company_id = forms.CharField(label='Company Identifier',
widget=forms.PasswordInput(attrs={'class': tailwind_class}))
class Meta:
model = get_user_model()
fields = ('email', 'password1', 'password2', 'company_id')
# Custom validator for the company id
def clean_company_id(self):
company_id = self.cleaned_data['company_id']
if not Company.objects.get(id=company_id):
raise ValidationError("This Company ID doesn't exist")
# Return value to use as cleaned data
return company_id
чей валидатор работает, за исключением отображения сообщения об ошибке в случае не валидации.
Это мой шаблон:
<form class="form shadow-2xl min-w-[360px] max-w-[360px] p-4 bg-woys-purple rounded-lg text-white" method="post" action=".">
{% csrf_token %}
<div class="error-wrapper mb-2">
<div class="errors text-woys-error-light text-center">{{ form.errors.email }}</div>
<div class="errors text-woys-error-light text-center">{{ form.errors.password2 }}</div>
<div class="errors text-woys-error-light text-center">{{ form.non_field_errors }}</div>
</div>
...
Это не сработает.
Когда вы делаете:
SomeModel.objects.get(...)
Если объект не существует в параметрах фильтра get(), это вызовет ошибку SomeModel.DoesNotExist
, поэтому попробуйте заменить .get()
на filter(...).exists()
и таким образом вы получите вашу пользовательскую ошибку.
Я имею в виду изменение этой строки кода:
if not Company.objects.get(id=company_id):
Кроме того, если вы просто хотите обновить сообщение об ошибке, вы можете указать и переопределить сообщения для каждого из полей и каждого типа или ошибки, которая может произойти для данного типа поля.
См. этот пост, на который был дан ответ ранее, где описано, как это сделать:
Создание пользовательских сообщений об ошибках с помощью моделей форм
Кроме того, я только что заметил, что в вашем шаблоне вы не отображаете ошибки для этого поля, поэтому, пожалуйста, добавьте строку для отображения ошибок поля для id компании
<div class="errors text-woys-error-light text-center">{{ form.errors.company_id }}</div>