自定义错误消息与模型窗体
我可以看到如何在使用表单时向字段添加错误消息,但模型表单呢?
这是我的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