#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'}