自定义错误消息与模型窗体

我可以看到如何在使用表单时向字段添加错误消息,但模型表单呢?

这是我的testing模型

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是“此字段是必需的”。 如何以模型forms更改?

对于简单情况,您可以指定自定义错误消息

 class AuthorForm(forms.ModelForm): first_name = forms.CharField(error_messages={'required': 'Please let us know what to call you!'}) class Meta: model = Author 

Django 1.6新增function :

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's name is too long."), }, } 

相关: Django的ModelForm – Meta选项列表在哪里?

我也想了很多次。 这就是为什么我最终为ModelForm类写了一个小扩展,它允许我通过Meta类设置任意的字段属性 – 包括错误信息。 代码和解释可以在这里find: 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!" } } } 

我想这就是你要找的东西,对吧?

另一个简单的方法是在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!'} 

最简单的方法是重写干净的方法:

 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 

我有一个更清洁的解决scheme,基于詹姆斯弗里德曼的答案。 这个解决scheme更干,特别是如果你有很多领域。

 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 

您可以通过覆盖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