2011-06-29 8 views
3

私のモデルでは、値 'A'、 'B'、 'C​​'のみを含むフィールドがあります。フィールドを宣言するときにchoiceパラメータを使用するのが最適でしょうか?Djangoの値のリストの検証

choiceパラメータを使用することを決定しておらず、カスタム検証ロジックを書きたいと思った場合は、どこに書きますか?これはモデルのcleanメソッドにありますか?私もclean_<fieldname>メソッドを見たことがあります - これはフォームにのみ適用されますか?私はフォームを使用していないので、モデルでこの検証をしたいと思います。

class Action(models.Model): 
    """ 
    Contains the logic for the visit 
    """ 
    id = models.AutoField(primary_key=True) 
    path = models.CharField(max_length=65535, null=False) 
    to = models.IntegerField(null=False) 

    def clean(self, **kwargs): 
     """ 
     Custom clean method to do some validation 
     """ 
     #Ensure that the 'to' is either 1,2 or 3. 
     if self.to not in [0, 1, 2]: 
      raise ValidationError("Invalid to value.") 

私が検証を行っているとき、値を返す必要がありますか?誰かが新しいレコードを作成すると、私のメソッドメソッドが呼び出されるのですか?

(私はドキュメントを読んだが、私はまだこれについて少し困惑している。)

おかげでトン。

+4

私はこのブログを読むことをお勧めします:http://www.b-list.org/weblog/2007/nov/02/handle-choices-right-way/ – Nix

答えて

1

、私はchoiceパラメータを使用します。 toフィールドの検証をcleanメソッドに設定すると、エラーはアクションインスタンスに関連付けられ、toフィールドには関連付けられません。

前述のとおり、clean_<fieldname>のメソッドはフォームフィールド用です。モデルでは、validatorsを定義することができます。

次に、バリデータとして書き直されたクリーンメソッドの例を示します。

from django.core.exceptions import ValidationError 

def validate_to(value): 
    """ 
    Ensure that the 'to' is either 1, 2 or 3. 
    """ 
    if value not in [1, 2, 3]: 
     raise ValidationError("Invalid 'to' value.") 

class Action(models.Model): 
    """ 
    Contains the logic for the visit 
    """ 
    id = models.AutoField(primary_key=True) 
    path = models.CharField(max_length=65535, null=False) 
    to = models.IntegerField(null=False,validators=[validate_to]) 
2

「A」、「B」、「C」のみにしたい場合は、独自のロールアップではなく、Djangoの組み込み検証を使用する必要があります。 choicesのセクションのhttps://docs.djangoproject.com/en/1.3/ref/models/fields/を参照してください。簡単に言うと

:あなたが与えた例では

class Action(models.Model): 
    """ 
    Contains the logic for the visit 
    """ 

    TO_CHOICES = (
     (0, 'Choice 0'), 
     (1, 'Choice 1'), 
     (2, 'Choice 2'), 
    ) 
    id = models.AutoField(primary_key=True) 
    path = models.CharField(max_length=65535, null=False) 
    to = models.IntegerField(null=False, choices=TO_CHOICES)