我遇到表单错误问题。我想更改表单错误显示的字段名称。
模型.py
class Sales(models.Model):
customer = models.ForeignKey("Customer")
ctype = models.ForeignKey("Customer_type", verbose_name="Customer Type")
forms.py
from django.utils.translation import ugettext_lazy as _
class Sales_form(forms.ModelForm):
class Meta:
model = Sales
fields = ('customer','ctype')
error_messages = {
'ctype' : {
'required' : _("Hey yow! this field is required!")
}
}
但错误仍然返回:
{"ctype": ["嘿哟!此字段为必填项!"]}
我想要的是这样的
{"客户类型": ["嘿哟!此字段为必填项!"]}
最佳答案
您可以为 Meta
中的字段指定标签,如下所示:
from django.utils.translation import ugettext_lazy as _
class Sales_form(forms.ModelForm):
class Meta:
model = Sales
fields = ('customer','ctype')
labels = {
'ctype': _('Customer Type'),
}
error_messages = {
'ctype' : {
'required' : _("Hey yow! this field is required!")
}
}
据我所知,没有直接的方法可以使用模型字段的 verbose_name 作为表单标签。不过,您可以使用 _meta
属性:
myfield = models.IntegerField(label=MyModel._meta.get_field('myfield').verbose_name)
在我看来这很老套,因为你仍然需要传递字段名。
您还可以使用字典理解
构建标签字典:
labels = {f.name: f.verbose_name for f in MyModel._meta.get_fields()}
但要小心这一点,因为 get_fields
还会返回 ManyToManyRel
,它没有属性 verbose_name
。
您可以引用render errors django 文档的一部分也可能会有所帮助。
如果您只想更改 form.errors 字典中的键,您可以使用以下方法来执行此操作:
labels = {f.name: f.verbose_name for f in MyModel._meta.get_fields()}
errors_keys = tuple(form.errors.keys())
for k in errors_keys:
form.errors[labels[k]] = form.errors[k]
del form.errors[k]
或者只是form.errors[labels[k]] = form.errors.pop(k)
。
另请检查this关于字典键替换的问题
关于python - Django更改表单字段错误消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38407365/