Пользовательская проверка формы Django не вызывает ValidationError

#django #django-forms

#джанго #django-формы

Вопрос:

У меня есть форма, которая в остальном работает. Возникают обычные ошибки проверки; однако моя пользовательская функция проверки не вызывает ошибки проверки. Как я могу это исправить, чтобы показать пользовательскую ошибку проверки?

 from django import forms


class UserRegistrationForm(forms.Form):
    GENDER=[('male','MALE'), ('female', 'FEMALE')]
    firstName=forms.CharField()
    lastName=forms.CharField()
    email=forms.EmailField()
    gender=forms.CharField(widget=forms.Select(choices=GENDER))
    password=forms.CharField(widget=forms.PasswordInput)
    emp_id=forms.IntegerField(label="Employee ID")
    
    def clean_firstName(self):
        inputFirstName = self.cleaned_data['firstName']
        if len(inputFirstName)>20:
            raise forms.ValidationError('First Name must not exceed 20 characters.')
        return inputFirstName
 

Я тоже пытался inputFirstName = self.cleaned_data.get('firstName')

В любом случае форма будет отправлена с данными, которые не соответствуют пользовательской проверке.

Комментарии:

1. вы проверяете frm_instance.is_valid() возвращаемое значение перед сохранением формы?

2. пожалуйста, опубликуйте свое мнение.

Ответ №1:

В вашем views.py вам нужно передать Форму request.POST примерно так.

 form = UserRegistrationForm(request.POST)
 

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

 return render(request,'path/to/your/template', {'form': form})
 

в вашем шаблоне.

 {{form.as_ul}}
 

И теперь вы сможете отобразить ошибку в своем шаблоне.

Ответ №2:

Поскольку это средство проверки, которое фокусируется на одном поле, имеет смысл добавить средство проверки к этому полю:

 from django.core.validators import MaxLengthValidator
from django import forms

class UserRegistrationForm(forms.Form):
    firstName = forms.CharField(
        validators=[MaxLengthValidator(20, 'First name must not exceed 20 characters.')]
    )
    # … 

Если вас не волнует сообщение об ошибке, вы можете использовать max_length=… параметр [Django-doc]:

 from django.core.validators import MaxLengthValidator
from django import forms

class UserRegistrationForm(forms.Form):
    firstName = forms.CharField(max_length=20)
    # … 

Ответ №3:

Я думаю, вы забыли проверить правильность вашей формы перед ее сохранением.
Формы Django не вызывают ошибок. вместо этого они предоставляют вам метод, который проверяет данные и определяет, являются ли они действительными или нет. Имя метода is_valid() . он возвращает логическое значение, указывающее результат проверки, а также собирает все допустимые данные в cleaned_data свойство экземпляра формы.
Здесь я привел рабочий пример:

 from django import forms

class UserRegistrationForm(forms.Form):
    firstName=forms.CharField()
    def clean_firstName(self):
        inputFirstName = self.cleaned_data['firstName']
        if len(inputFirstName)<3:
            raise forms.ValidationError('First Name must be at least 3 characters.')
        return inputFirstName

frm = UserRegistrationForm({"firstName":"ab"})
frm.is_valid() # result: False
frm.cleaned_data # result: {}
frm = UserRegistrationForm({"firstName":"abc"})
frm.is_valid() # result: True
frm.cleaned_data # result: {'firstName': u'abc'}