自定义Django中的模型验证值形成错误消息

时间:2017-02-05 10:50:56

标签: validation django-forms

我创建了一个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值进行硬编码。我想从模型定义中读取它。怎么办呢?

1 个答案:

答案 0 :(得分: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