Django - 使用自编写的Validator时出现错误的验证错误消息

时间:2017-07-13 10:03:56

标签: python django validation

我编写了自己的验证器,因为我的表单中有几个字段,其中相同的验证适用,我想用clean_field()方法减少我的代码。 我的表格如下:

class EducationProjectAjaxForm(forms.Form):
    study_fees_year_1 = forms.IntegerField(required=False, validators=[validate_study_fees])
    study_fees_year_2 = forms.IntegerField(required=False, validators=[validate_study_fees])
    study_fees_year_3 = forms.IntegerField(required=False, validators=[validate_study_fees])
    study_fees_year_4 = forms.IntegerField(required=False, validators=[validate_study_fees])

我的验证器如下所示:

def validate_study_fees(data):
    if data:
        if data > 100000:
            raise ValidationError(_('Falscher Wert: %(value)s'),
                                  code='invalid',
                                  params={
                                      'value': 'Es sind maximal 100.000 € Studiengebühren pro Jahr erlaubt.'},
                                  )
        if data % 10 != 0:
            raise ValidationError(_('Falscher Wert: %(value)s'),
                                  code='invalid',
                                  params={
                                      'value': 'Der eingetragene Wert muss durch 10 teilbar sein.'},
                                  )
        if data < 0:
            raise ValidationError(_('Falscher Wert: %(value)s'),
                                  code='invalid',
                                  params={'value': 'Der Finanzierungsbedarf darf nicht negativ sein'},
                                  )
    return data

我的问题是,即使验证本身已正确应用,我收到错误的错误消息:“请选择整数”。该消息可能来自IntegerFields的正常验证,但类似123的内容会抛出相同的消息,即使它是一个整数。 如果使用clean_study_fees_year_1(自我),...正确显示错误消息。有什么东西可以解决我的问题,所以我可以有更清洁的代码吗? 在此先感谢。

Django版本:1.10

1 个答案:

答案 0 :(得分:0)

您应该为不同的错误消息使用唯一的错误代码。如果您使用code='invalid',Django会将您的错误消息替换为无效代码的默认消息。

此外,参数中的value应该是您要验证的值,而不是错误消息。

def validate_study_fees(data):
    if data:
        if data > 100000:
            raise ValidationError(_('Es sind maximal 100.000 € Studiengebühren pro Jahr erlaubt.'),
                                  code='too_large',
                                  params={
                                      'value': data},
                                  )
        if data % 10 != 0:
            raise ValidationError(_('Der eingetragene Wert muss durch 10 teilbar sein.'),
                                  code='not_divisible_by_10',
                                  params={
                                      'value': data},
                                  )
        if data < 0:
            raise ValidationError(_('Der Finanzierungsbedarf darf nicht negativ sein'),
                                  code='negative_value',
                                  params={'value': data},
                                  )
    return data

有关详细信息,请参阅docs on validators