2016-04-14 79 views
0

我写了一个自定义验证程序,如果给定的字段值为负值,将引发ValidationError。Django自定义验证程序不能正常工作

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
请帮帮我。

+0

验证器用于表单,不用于创建对象。如果你在表单之外创建一个对象,那么你需要提供另一种验证输入的方法。 – Sayse

+0

@Sayse然后如何验证给模型字段的输入? – rock

回答

5

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

要做到这一点,最简单的方法是,在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 

这类似于从形式会发生什么,显示在保存之前调用模型的full_clean方法,并会叫上你的模型的任何验证领域。

+0

所以我不得不重写save()方法来验证模型。 – rock

+0

@rock - 没有,因为这会让你在使用(模型)表单时两次验证。您只需确保在保存之前进行验证。如果你真的想要 – Sayse

+1

感谢您的解决方案,做一个'save_and_validate'方法。 – rock