python - Django更改表单字段错误消息

标签 python django

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

模型.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": ["嘿哟!此字段为必填项!"]}

我想要的是这样的

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

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)

在我看来这很老套,因为你仍然需要传递字段名。

您还可以使用字典理解构建标签字典:

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/

相关文章:

python - 高斯核的 FFT 不正确

python - 删除除具有特定条件的行之外的所有行

python - 如何让敌人跟随pygame中的玩家?

python - 将列表中的数字放置到元素不是 np.nan 的数组中

python - Django/django-tables2 行上的 html 表单击编辑表单

python - 为使用 Opencv 2.3 的算法创建 Python 包装器

python - django.core.exceptions.FieldError : Cannot resolve keyword 'timestamp' into field

django - 在 Django url 中传递 id

mysql.connector.errors.InterfaceError : Failed parsing EOF packet

Django 测试 POSTGIS 数据库 : no attribute geo_db_type