2016-04-14 3 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 - これは、(モデル)フォームを使用するたびに2回検証するためです。保存する前に確認をするだけです。本当にしたい場合は 'save_and_validate'メソッドを作ってください – Sayse

+1

解決してくれてありがとう。 – rock

関連する問題