Как я могу получить текст ValidationError при обработке формы?
есть код:
class CinemaAddForm(forms.ModelForm):
class Meta:
model = Cinema
fields = ('title', 'adress')
widgets = {
'Название': forms.CharField(max_length=30),
'Адрес': forms.CharField(max_length=250)
}
def clean_title(self):
data = self.cleaned_data['title']
if data == '':
# self.add_error('title', "Вы забыли про название кинотеатра")
raise forms.ValidationError("Вы забыли про название кинотеатра")
return data
def clean_adress(self):
data = self.cleaned_data['adress']
if data == '':
#self.add_error('adress', "Вы забыли про адрес кинотеатра")
raise forms.ValidationError("Вы забыли про адрес кинотеатра")
return data
Если какое-то из полей пустое, я хочу при проверке формы вызвать ошибку с текстом, например Вы забыли про название кинотеатра, теперь у меня есть View:
class AddCinemaApiView(View):
def post(self, request: WSGIRequest):
error = ''
title = request.POST.get('title')
adress = request.POST.get('adress')
form = CinemaAddForm(request.POST)
if form.is_valid():
return JsonResponse({'ok': True})
else:
print(form.errors)
return JsonResponse({'ok': False, 'error': form.errors})
Я отправляю в ответ json (данный view вызывается по нажатию кнопки, а через JS fetch делается запрос со всем нужными данными)
И на сайте я хочу вывести ошибки через JS скрипт: 
И вроде бы всё должно работать, но почему-то я получаю вот такой текст:

Хотя ни в одном месте в коде я данный текст не добавлял, соответственно у меня вопрос: как мне получить именно тот текст, который я передаю в ValidationError?
Ответы (2 шт):
ты можешь переопределить текст для стандартных сообщений об ошибке у нужных тебе полей
class CinemaAddForm(forms.ModelForm):
title = forms.CharField(error_messages={'required': 'Вы забыли про название кинотеатра'})
adress = forms.CharField(error_messages={'required': 'Вы забыли про адрес кинотеатра'})
class Meta:
model = Cinema
fields = ('title', 'adress')
https://docs.djangoproject.com/en/dev/ref/forms/fields/#error-messages
Проблему решил сам:
Модель даёт форме некоторые правила, которые проверяются перед вызовами clean для всех полей и всей формы. Если на этом этапе появилась ошибка, то до валидации определенной в форме дело так и не дойдет.
Чтобы избежать этого, в модели нужно указать blank=false у нужных полей т.к. именно этот параметр отвечает за возможность оставлять в поле формы пустой текст (не путайте blank=false с null=false):
Field.blankЕсли значение равно
True, поле может быть пустым.По умолчанию это False.Обратите внимание, что это отличается от null. null относится исключительно к базе данных, а blank относится к валидации. Когда поле есть blank=True , проверка формы позволяет вводить пустые значения. Если в поле есть blank=False , поле необходимо заполнить.
однако, если вы не хотите менять модель (например если форма для пользователя должна работать как-то по своему, а форма в админке - по своему) Вы можете сделать как я: добавить конструктор в форму, и отдельно для каждого поля (или как я, для всех полей), задать
fields['название поля'].required = False
Тогда форма не будет следовать правилам определенным в модели, и вы сможете делать валидацию полностью самостоятельно. Вот полный код формы:
class CinemaAddForm(forms.ModelForm):
class Meta:
model = Cinema
fields = ('title', 'adress')
widgets = {
'Название': forms.CharField(max_length=30),
'Адрес': forms.CharField(max_length=250, )
}
def __init__(self, *args, **kwargs):
super(CinemaAddForm, self).__init__(*args, **kwargs)
for key in self.fields:
self.fields[key].required = False
def clean_title(self):
if self.cleaned_data['title'] == '':
raise forms.ValidationError("Вы забыли про название кинотеатра")
return self.cleaned_data['title']
def clean_adress(self):
if self.cleaned_data['adress'] == '':
raise forms.ValidationError("Вы забыли указать адрес")
return self.cleaned_data['adress']