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

标签 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(self) 的方式进行操作,...错误消息会正确显示。有什么办法可以解决我的问题,以便我可以获得更清晰的代码吗? 提前致谢。

Django 版本:1.10

最佳答案

您应该为不同的错误消息使用唯一的错误代码。如果您使用 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了解更多信息。

关于python - Django - 使用自己编写的验证器时出现错误的验证错误消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45077458/

相关文章:

来自 ISO8601 时间戳字符串的 Django 模型 DateTimeField

javascript - 在 Angular 单元测试中将表单设置为 $valid

c++ - 创建表达式的实现建议,稍后用于评估 c++ 中映射的内容?

python - 获取具有退出状态的单独变量中的 stderr 和 stdout

python - 在Python中按元素比较两个列表

Python XML 解析器 : junk after document element

javascript - jQuery - 检查输入、文本区域和选择的值是否在同一函数中不为空

python - 我可以使用日期索引在 pandas 中创建虚拟对象吗?

django - 在 Django 中持续运行 Celery 任务

javascript - 附加值为 bool 值 false 的 FormData 字段会导致该函数失败。