Skip to main content
 首页 » 编程设计

python之Django 更改表单字段错误信息

2025年04月02日39JeffreyZhao

我遇到了表单错误的问题。我想更改表单错误显示的字段名称。

模型.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": ["嗨哟!这个字段是必需的!"]}

我想要的是这样的

{“客户类型”:[“嘿哟!此字段为必填项!”]}

http://pastebin.com/w6UkjzHF

请您参考如下方法:

您可以像这样在 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关于字典键替换的问题