Django 自定义验证器不工作
Django Custom Validators Not Working
我写了一个自定义验证器,如果给定的字段值为负,它将引发 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.
请帮助我。
验证器用于表单,而不是用于创建对象。如果您在表单之外创建对象,则需要提供一种替代方法来验证输入。
最简单的方法是在保存之前调用模型的 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
这类似于表单中发生的情况,并且会在您的模型字段上调用任何验证器。
我运行遇到了同样的问题。因此验证器仅在您使用 Forms 和 Model Form 填写时才起作用。
尽管如此,您可以在 shell 中验证验证器。
python manage.py shell
>>>from app.models import Book
>>>Book.price.field.run_validators(value=<undesirable value>)
这会引发验证错误,因此您可以确定您的验证有效。
我写了一个自定义验证器,如果给定的字段值为负,它将引发 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.
请帮助我。
验证器用于表单,而不是用于创建对象。如果您在表单之外创建对象,则需要提供一种替代方法来验证输入。
最简单的方法是在保存之前调用模型的 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
这类似于表单中发生的情况,并且会在您的模型字段上调用任何验证器。
我运行遇到了同样的问题。因此验证器仅在您使用 Forms 和 Model Form 填写时才起作用。
尽管如此,您可以在 shell 中验证验证器。
python manage.py shell
>>>from app.models import Book
>>>Book.price.field.run_validators(value=<undesirable value>)
这会引发验证错误,因此您可以确定您的验证有效。