Django 使用模型表单创建自定义错误消息

Django 使用模型表单创建自定义错误消息,django,django-forms,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.DateTim

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

这是我的测试模型:

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\u name
last\u name
为:

此字段为必填字段


如何在模型表单中更改此选项?

最简单的方法是覆盖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

最简单的方法是覆盖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

对于简单的情况,您可以


对于简单的情况,您可以


我也曾多次对此感到疑惑。这就是为什么我最终编写了ModelForm类的一个小扩展,它允许我通过Meta类设置任意字段属性(包括错误消息)。代码和说明可在此处找到:

您将能够执行以下操作:

class AuthorForm(ExtendedMetaModelForm):
    class Meta:
        model = Author
        field_args = {
            "first_name" : {
                "error_messages" : {
                    "required" : "Please let us know what to call you!"
                }
            }
        }

我想这就是你想要的,对吗?

我也曾多次对此感到好奇。这就是为什么我最终编写了ModelForm类的一个小扩展,它允许我通过Meta类设置任意字段属性(包括错误消息)。代码和说明可在此处找到:

您将能够执行以下操作:

class AuthorForm(ExtendedMetaModelForm):
    class Meta:
        model = Author
        field_args = {
            "first_name" : {
                "error_messages" : {
                    "required" : "Please let us know what to call you!"
                }
            }
        }

我想这就是你想要的,对吗?

另一种简单的方法是在init中重写它。


另一种简单的方法是在init中重写它。

:

ModelForm接受几个新的元选项

  • 本地化字段列表中包含的字段将本地化(通过在表单字段上设置本地化)
  • 标签、帮助信息和错误信息选项可用于自定义默认字段,有关详细信息,请参阅
由此:

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."),
            },
        }
相关:

ModelForm接受几个新的元选项

  • 本地化字段列表中包含的字段将本地化(通过在表单字段上设置本地化)
  • 标签、帮助信息和错误信息选项可用于自定义默认字段,有关详细信息,请参阅
由此:

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."),
            },
        }

相关:

根据詹姆斯弗里德曼的回答,我有一个更干净的解决方案。 这个解决方案甚至更加干燥,特别是如果你有很多田地的话

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

根据詹姆斯弗里德曼的回答,我有一个更干净的解决方案。 这个解决方案甚至更加干燥,特别是如果你有很多田地的话

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\u error(字段,消息)
,您可以轻松地检查和放置自定义错误消息:


通过重写
clean()
方法并使用
self.add\u error(字段,消息)
,您可以轻松地检查和放置自定义错误消息:



很酷,谢谢。我不知道这样做会有什么结果。文档中说“声明的字段将覆盖使用model属性生成的默认字段”,所以我应该很好。我还必须在模型表单字段上再次设置max_字段。是否确实需要在表单中重复字段声明?django引以为傲的干式原理如何?哈哈,伙计,我认为OP希望使用模型中的表单,但不要两次声明表单。我认为对于客户端来说,显式比干式更重要。酷,谢谢。我不知道这样做会有什么结果。文档中说“声明的字段将覆盖使用model属性生成的默认字段”,所以我应该很好。我还必须在模型表单字段上再次设置max_字段。是否确实需要在表单中重复字段声明?django引以为傲的DRY原则怎么样?哈哈,伙计,我认为OP希望使用模型中的表单,但不要两次声明表单。我认为对于客户端来说,显式比DRY更重要。这是一个很好的方法。当然比重新定义表单字段更枯燥。@suda如果您不是真正重新定义表单字段,那么您将覆盖基于关联模型的默认行为。与将输入更改为文本区域类似,您正在覆盖默认值。这是一个很好的方法。当然比重新定义表单字段更枯燥。@suda如果您不是真正重新定义表单字段,那么您将覆盖基于关联模型的默认行为。与将输入更改为textarea类似,您正在覆盖默认值。这是一个比此线程中的所有其他解决方案好得多的解决方案,因为1)您不必使用任何扩展2)您不必重写整个表单字段定义,因为它取决于模型字段的定义+1一个注意事项是,您必须像这样使用它
self.fields['name']。错误消息['required']='请让我们知道如何称呼您!'
或使用
.update()
方法,否则将重置所有其他错误消息。这是比此线程中所有其他错误消息更好的解决方案,因为1)不必使用任何扩展2)不必重写整个表单字段定义,因为它取决于模型字段的定义+1一个注意事项是,您必须像这样使用它
self.fields['name']。错误消息['required']='请让我们知道如何称呼您!'
或使用
.update()
方法,否则您将重置所有其他错误消息。我不理解自定义错误消息文本周围的“\”,因此我将其删除。但这是第一个对我有用的片段。我在django 1.6上。谢谢你,先生!不客气!如果您感到好奇,下划线函数是国际化实用程序的常见快捷方式:我认为这应该是公认的答案,因为它遵循枯燥的原则。在使用ModelForm时,不应该再次声明字段,也不应该重写方法。只有在没有刻意定义字段和小部件的情况下,才会使用元类中的默认值。如果它们是故意定义的,那么错误消息应该在那里定义,或者在
\uuuuu init\uuuu
方法中定义。我不理解周围的情况