模型表单的自定义错误消息

时间:2010-08-09 00:45:00

标签: django django-forms

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

这是我的测试模型

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是“此字段是必需的”。如何在模型表单中更改它?

7 个答案:

答案 0 :(得分:46)

New in Django 1.6

  

ModelForm接受几个新的Meta选项。

     
      
  • localized_fields列表中包含的字段将被本地化(通过在表单字段上设置localize)。
  •   
  • 标签,help_texts和error_messages选项可用于自定义默认字段,有关详细信息,请参阅Overriding the default fields
  •   

从那起:

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's ModelForm - where is the list of Meta options?

答案 1 :(得分:38)

对于简单的情况,您可以specify custom error messages

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

答案 2 :(得分:15)

我也多次想过这件事。这就是为什么我最终为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!"
                }
            }
        }

我认为这就是你要找的,对吗?

答案 3 :(得分:15)

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

答案 4 :(得分:7)

最简单的方法是覆盖clean方法:

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

答案 5 :(得分:5)

根据jamesmfriedman的回答,我有一个更清洁的解决方案。 这个解决方案更加干燥,特别是如果你有很多领域。

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

答案 6 :(得分:2)

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