2016-08-13 4 views
1

ジャンゴ1.10のModelFormとunique_together検証

documentaionはきれいな方法が正しくオーバーライドされた場合のModelFormが一緒に独自の検証と言います。 https://docs.djangoproject.com/en/1.10/topics/forms/modelforms/#overriding-the-clean-method

私はunique_togetherの検証がうまくいかず、何か間違ったことをしました。

>>> from wiki.models import Wiki 
>>> Wiki.objects.all() 
<QuerySet [<Wiki: image/1/fdfff>, <Wiki: image/1/fdffff>]> 

ここで、imageはrelated_model、1はrelated_idです。

このオーバーライドで何が問題なのか理解してもらえますか?

class WikiForm(ModelForm): 
    class Meta: 
     model = Wiki 
     fields = ['related_model', 'related_id', 'article'] 
     unique_together = (("related_model", "related_id"),) 

    def validate_related_model(self): 
     ... 

    def validate_related_id(self): 
     ... 

    def clean(self): 
     self.validate_related_model() 
     self.validate_related_id() 

     # To maintain unique_together validation, 
     # we must call the parent class’s clean() method. 
     return super(WikiForm, self).clean() 

答えて

2

unique_togetherは、データベースレベルの制約です。それは、モデルのフォームではなく、モデルのクラスMetaで指定されているはずです。検証が必要な場合は、Wikiモデルに移動してください。あなたのフォームでは、おそらくそれらの余分な検証方法を持つ必要はありません。

これは当てはまりませんが、ユニークな検証が正しく機能するためには、モデルフォームにunique_together制約で指定されているすべてのフィールドが含まれている必要があります。

def validate_unique(self): 
    # Must remove organization field from exclude in order 
    # for the unique_together constraint to be enforced. 
    exclude = self._get_validation_exclusions() 
    exclude.remove('organization') 

    try: 
     self.instance.validate_unique(exclude=exclude) 
    except ValidationError, e: 
     self._update_errors(e.message_dict) 

を例では、私は、フォームのリストからorganizationを削除しています上:related_modelまたはrelated_idフォームから除外されたのであれば、あなたは正しい検証が起こることを可能にするためにいくつかの余分な作業を行う必要があると思いますそれはunique_together制約の一部なので除外されたフィールドの

+0

ありがとうございました。 – Michael

関連する問題