我遇到了表单错误的问题。我想更改表单错误显示的字段名称。
模型.py
class Sales(models.Model):
customer = models.ForeignKey("Customer")
ctype = models.ForeignKey("Customer_type", verbose_name="Customer Type")
表单.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)
我的口味很老套,因为您仍然需要传递字段名。
您还可以使用 dictionary comprehension 构建标签字典:
labels = {f.name: f.verbose_name for f in MyModel._meta.get_fields()}
但是要小心,因为 get_fields 还会返回没有属性 verbose_name 的 ManyToManyRel。
可以引用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关于字典键替换的问题
