【问题标题】:Django Custom Validators Not WorkingDjango 自定义验证器不工作
【发布时间】:2016-08-05 15:25:10
【问题描述】:

我写了一个自定义验证器,如果给定的字段值为负数,它将引发 ValidationError。

  def validate_positive(value):
        if value < 0:
            raise ValidationError(
                    _('%(value) is negative number'),
                    params = {'value': value}
                    )

我通过字段的验证器参数将此添加到我的模型字段

class Book(models.Model):
    user = models.ForeignKey(User,on_delete=models.CASCADE)
    title = models.CharField(max_length=50)
    price = models.IntegerField(default=0,validators=[validate_positive])
    quantity = models.IntegerField(default=0,validators=[validate_positive])

但在创建对象时,如果价格小于零,则不会引发任何错误。
我不知道我在哪里做错了,我是 django 的新手。
我正在使用 Django 1.9
请帮帮我。

【问题讨论】:

  • 验证器用于表单,而不是用于创建对象。如果您在表单之外创建对象,则需要提供另一种方法来验证输入。
  • @Sayse 那么如何验证提供给模型字段的输入?

标签: django python-2.7 django-models django-validation


【解决方案1】:

验证器用于表单,而不是用于创建对象。如果您在表单之外创建对象,那么您需要提供另一种方法来验证输入。

最简单的方法是在保存之前调用模型的full_clean方法,如docs所示

from django.core.exceptions import ValidationError
try:
    article.full_clean()
except ValidationError as e:
    # Do something based on the errors contained in e.message_dict.
    # Display them to a user, or handle them programmatically.
    pass

这类似于表单中发生的情况,并且会调用模型字段上的任何验证器。

【讨论】:

  • 所以我必须重写 save() 方法来验证模型。
  • @rock - 不是真的,因为这会让你在每次使用(模型)表单时验证两次。您只需要确保在保存之前进行验证。如果你真的想的话,做一个save_and_validate 方法
  • 感谢您的解决方案。
【解决方案2】:

我遇到了同样的问题。因此,验证器仅在您使用表单和模型表单填写时才起作用。

您可以在 shell 中验证验证器。

python manage.py shell
>>>from app.models import Book
>>>Book.price.field.run_validators(value=<undesirable value>)

这会引发验证错误,因此您可以确保验证正常。

【讨论】:

    猜你喜欢
    • 2011-09-04
    • 2012-04-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-08
    • 2021-06-19
    相关资源
    最近更新 更多