2011-08-17 13 views
7

私はいくつかのフィールドを持つModelFormを持っています。いくつかのフィールドは必須であり、いくつかは必要ありません。また、私は別の選択肢を持つSelectフィールドを持っており、このSelectフィールドの選択に基づいてフィールドのいくつかを「必須」にしたいと思っています。Djangoモデルフォームは、他のフィールド選択に基づいて「必須」属性を削除します

私はフォーム

def clean(self): 
    cleaned_data = self.cleaned_data 
    some_field = cleaned_data.get("some_field") 
    if some_field == 'some_value': 
      self.fields['other_field'].required = False 
    return cleaned_data 

のクリーン()メソッドにしようとしたが、それは

答えて

10

Cleaning and validating fields that depend on each otherのDjangoドキュメントを参照してください。標準的な方法ではなく、ハンドリング、以下を実行するために、次のようになります。

def clean(self): 
    cleaned_data = self.cleaned_data 
    some_field = cleaned_data.get("some_field") 
    if some_field == 'some_value': 
      # 'other_field' is conditionally required. 
      if not cleaned_data['other_field']: 
       raise forms.ValidationError("'Other_field' is required.") 
    return cleaned_data 
+0

感謝を。このアイデアは私にそれを手伝ってくれました! – Igor

+0

私は同様の検証(Django 1.4)を行う必要がありますが、私がテストしているフィールドは読み取り専用なので、私はcleaned_data(btw - 私は管理者でそれをやっています)にはありません。どのようにこの読み取り専用フィールドの値にアクセスするための任意のアイデア? 10x – Lin

+0

解決策を見つけました - form.instanceにすべての関連データがあり、変更されたデータはform.changed_dataに含まれています – Lin

1

を動作しません。あなたは正しい考えを持っているが、問題は、個々のフィールド検証がすでにフォームの前に実行していることですクリーン。いくつかのオプションがあります。あなたはフィールドを必要とせず、いつあなたのform.cleanに必要なときのロジックを扱うことができます。または、フィールドを必要なままにして、クリーンで発生させる可能性がある検証エラーを削除することもできます。

def clean(self): 
    cleaned_data = self.cleaned_data 
    some_field = cleaned_data.get("some_field") 
    if some_field == 'some_value': 
      if 'other_field' in self.errors: 
       del self.errors['other_field'] 
       cleaned_data['other_field'] = None 
    return cleaned_data 

これはそれだけで/必要なエラーが欠落していない、すべてエラーを取り除くことで、いくつかの問題があります。 cleaned_dataにも問題があります。あなたは今、私がNoneとしてそれを追加したcleaned_dataにない必須フィールドを持っています。残りのアプリケーションはこのケースを処理する必要があります。値を持たない必須フィールドを持つのは奇妙に思えるかもしれません。

2

あなたは一般的な方法で必要なフィールドにエラーメッセージを出力したい場合は、この操作を行うことができます。

def clean(self): 
    cleaned_data = super(PasswordChangeForm, self).clean() 
    token = cleaned_data.get('token') 
    old_password = cleaned_data.get('old_password') 
    if not token and not old_password: 
     self._errors['old_password'] = self.error_class([self.fields['old_password'].error_messages['required']]) 
+0

この回答は本当に、本当に便利です!どうもありがとう ! – Serafeim

関連する問題