Пользовательские сообщения об ошибках с формой модели
Я могу увидеть, как добавить сообщение об ошибке в поле при использовании форм, но как насчет формы модели?
Это моя тестовая модель
class Author(models.Model):
first_name = models.CharField(max_length=125)
last_name = models.CharField(max_length=125)
created = models.DateTimeField(auto_now_add=True)
updated = models.DateTimeField(auto_now=True)
Моя модельная форма
class AuthorForm(forms.ModelForm):
class Meta:
model = Author
Сообщение об ошибке в полях: first_name и last_name - "Это поле обязательно". Как изменить это в модельной форме?
Ответы
Ответ 1
Для простых случаев вы можете указать настраиваемые сообщения об ошибках
class AuthorForm(forms.ModelForm):
first_name = forms.CharField(error_messages={'required': 'Please let us know what to call you!'})
class Meta:
model = Author
Ответ 2
Новое в Django 1.6:
ModelForm принимает несколько новых опций Meta.
- Поля, включенные в список localized_fields, будут локализованы (путем установки локализации в поле формы).
- Параметры ярлыков, help_texts и error_messages могут использоваться для настройки полей по умолчанию, см. Переопределение полей по умолчанию для деталей.
Из этого:
class AuthorForm(ModelForm):
class Meta:
model = Author
fields = ('name', 'title', 'birth_date')
labels = {
'name': _('Writer'),
}
help_texts = {
'name': _('Some useful help text.'),
}
error_messages = {
'name': {
'max_length': _("This writer name is too long."),
},
}
Связанный: Модель Django ModelForm - где список опций Meta?
Ответ 3
Я тоже много думал об этом. Вот почему я, наконец, написал небольшое расширение класса ModelForm, которое позволяет мне устанавливать произвольные атрибуты поля, включая сообщения об ошибках, через класс Meta. Код и объяснение можно найти здесь: http://blog.brendel.com/2012/01/django-modelforms-setting-any-field.html
Вы сможете делать такие вещи:
class AuthorForm(ExtendedMetaModelForm):
class Meta:
model = Author
field_args = {
"first_name" : {
"error_messages" : {
"required" : "Please let us know what to call you!"
}
}
}
Я думаю, что вы ищете, правильно?
Ответ 4
Другой простой способ сделать это просто переопределить его в init.
class AuthorForm(forms.ModelForm):
class Meta:
model = Author
def __init__(self, *args, **kwargs):
super(AuthorForm, self).__init__(*args, **kwargs)
# add custom error messages
self.fields['name'].error_messages = {'required': 'Please let us know what to call you!'}
Ответ 5
Самый простой способ - переопределить чистый метод:
class AuthorForm(forms.ModelForm):
class Meta:
model = Author
def clean(self):
if self.cleaned_data.get('name')=="":
raise forms.ValidationError('No name!')
return self.cleaned_data
Ответ 6
У меня есть более чистое решение, основанное на ответе jamesmfriedman.
Это решение еще более DRY, особенно если у вас много полей.
custom_errors = {
'required': 'Your custom error message'
}
class AuthorForm(forms.ModelForm):
class Meta:
model = Author
def __init__(self, *args, **kwargs):
super(AuthorForm, self).__init__(*args, **kwargs)
for field in self.fields:
self.fields[field].error_messages = custom_errors
Ответ 7
Вы можете легко проверить и поместить собственное сообщение об ошибке, переопределив метод clean()
и используя self.add_error(field, message)
:
def clean(self):
super(PromotionForm, self).clean()
error_message = ''
field = ''
# reusable check
if self.cleaned_data['reusable'] == 0:
error_message = 'reusable should not be zero'
field = 'reusable'
self.add_error(field, error_message)
raise ValidationError(error_message)
return self.cleaned_data