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

iJK*_*iJK 44 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)
Run Code Online (Sandbox Code Playgroud)

我的模特形式

class AuthorForm(forms.ModelForm):
    class Meta:
        model = Author
Run Code Online (Sandbox Code Playgroud)

字段:first_name和last_name上的错误消息是"此字段是必需的".如何在模型表单中更改它?

doc*_*red 47

Django 1.6中的新功能:

ModelForm接受几个新的Meta选项.

  • localized_fields列表中包含的字段将被本地化(通过在表单字段上设置localize).
  • 标签,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."),
            },
        }
Run Code Online (Sandbox Code Playgroud)

相关:Django的ModelForm - 元选项列表在哪里?

  • 别客气!如果您感到好奇,下划线功能是国际化实用程序的常用快捷方式:http://stackoverflow.com/questions/2964244/django-meaning-of-leading-underscore-in-list-of-tuples-used-对确定选音响 (4认同)

che*_*art 41

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

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

  • 是否真的有必要在表单中重复字段声明?Django为DRY原则感到自豪的是什么? (18认同)

jam*_*man 17

另一种简单的方法是在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!'}
Run Code Online (Sandbox Code Playgroud)

  • 一个注意事项,你必须使用它像`self.fields ['name'] .error_messages ['required'] ='请让我们知道你叫什么!'`或者使用`.update()`方法,否则您重置所有其他错误消息. (3认同)

jbr*_*del 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!"
                }
            }
        }
Run Code Online (Sandbox Code Playgroud)

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


Mer*_*moz 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
Run Code Online (Sandbox Code Playgroud)


Vin*_*oft 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
Run Code Online (Sandbox Code Playgroud)