【问题标题】:Model validation values in custom Django form error messages自定义 Django 表单错误消息中的模型验证值
【发布时间】:2017-02-05 10:50:55
【问题描述】:

我创建了一个 Django 表单:

class AddFaceForm(forms.ModelForm):

    class Meta:
        model = Face
        fields = ('person', 'x', 'y', 'w', 'h')

Face模型中,w被定义为

w = models.DecimalField(
    'Relative width',
    validators=[MinValueValidator(0.05), MaxValueValidator(1)]
)

如果用户输入 0 作为宽度,Django 在表单验证时返回的错误消息是

确保该值大于或等于 0.05。

所以它很好地包含了来自MinValueValidator 的值。我想将其更改为“相对宽度必须 >= 0.05”。

为了实现它,我尝试在 AddFaceForm Meta 中自定义错误

class AddFaceForm(forms.ModelForm):

    class Meta:
        model = Face
        fields = ('person', 'x', 'y', 'w', 'h')
        error_messages = {
            'w': {
                'min_value': 'Relative width must be >= 0.05'
            }
        }

但这意味着硬编码 0.05 值。我想从模型定义中读取它。如何做到这一点?

【问题讨论】:

    标签: validation django-forms


    【解决方案1】:

    好问题。

    MinValueValidatorBaseValidator 的子类。而且,BaseValidator 在其构造函数中采用可选消息。从code可以看出消息可以使用以下三个参数:limit_valueshow_valuevaluelimit_value 是验证器的最小值,在这种情况下为 0.05show_value 是用户输入的清理值,value 是他们输入的原始值。因此,您可以执行以下操作来实现您的目标:

    from django.core.validators import MinValueValidator
    from django.db import models
    from django.utils.translation import ugettext_lazy as _
    
    
    class Face(models.Model):
        w = models.DecimalField(
            'Relative width',
            max_digits=5,
            decimal_places=2,
            validators=[MinValueValidator(0.05, _('Relative width must be >= %(limit_value)s'))],
        )
    

    或者,如果您希望在表单中指定错误消息,则可以执行以下操作:

    from django import forms
    from django.utils.translation import ugettext_lazy as _
    
    from .models import Face
    
    
    class FaceForm(forms.ModelForm):
        class Meta:
            model = Face
            fields = ['w']
            error_messages = {
                'w': {
                    'min_value': _('Relative width must be >= %(limit_value)s')
                }
            }
    

    DecimalField 文档告诉您可以插入 limit_value

    【讨论】:

    • 谢谢,这是一个可行的解决方案。但是,它不是将模型层(限制定义)与表示层(错误消息文本)混合在一起吗?我更愿意单独定义错误文本,在这里我定义我的站点如何与用户交互(即在视图和模板中)。是否可以在验证定义之外访问limit_value?像 w.validators[0].limit_value 这样的东西吗?
    • 这很好。我会用我最近的发现更新我的答案。
    • 太棒了。正是我一直在寻找的。非常感谢。
    猜你喜欢
    • 1970-01-01
    • 2011-10-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-31
    • 1970-01-01
    相关资源
    最近更新 更多