【问题标题】:Django: Order of validation in ModelsDjango:模型中的验证顺序
【发布时间】:2016-01-18 08:47:08
【问题描述】:

最近我发现可以直接在models.py文件中定义Django表单验证。这可以通过以下方式完成:

fev1_liter = models.DecimalField(validators=[MaxValueValidator(8.2),
             MinValueValidator(0.3)], 
             max_digits=3, decimal_places=2)

这是 forms.py 中验证的绝佳替代方案,但我确实有一个非常烦人的问题: 如何控制验证的执行顺序? 在此示例中,Django 将首先验证输入数字是否为 x.xx 格式,然后是最小值和最大值。这会导致一些非常混乱的错误消息。 提前致谢!

【问题讨论】:

  • 你能发布那些错误信息吗?
  • 如果您输入 25,则错误消息是“允许分隔符前只有一位数字”,而不是更用户友好的“值必须介于 0.3 -8.2 之间”。

标签: django django-models django-forms django-validation


【解决方案1】:

对于每个模型字段,field.clean() 首先通过field.validate() 执行字段验证,然后通过field.run_validators(),按照从field.validators 迭代器返回的顺序调用验证器。

这是有道理的,因为在一般情况下,如果字段验证失败,您可以预期您的验证器会失败,因此它使调试更容易。请记住,字段验证器不是强制性的,因此field.validate() 优先。如果要更改行为,则必须创建自己的 Field 类并覆盖 field.clean() 行为。

您可以查看field sources 了解更多详情。

【讨论】:

  • 我希望有一个简单的解决方法。但是,为什么验证按当前顺序是完全有道理的。感谢您的回答。
猜你喜欢
  • 2019-12-24
  • 2017-08-16
  • 2011-08-21
  • 2013-12-16
  • 1970-01-01
  • 2021-08-05
  • 2010-12-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多