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