2012-05-17 11 views
5

私は管理者の確認の前にフィールドに値を設定したいと思います。adminサイトのカスタムクリーンメソッドを作成するにはどうしたらいいですか?

models.py

class Ad(models.Model): 
    ..... 
    manual_code = models.BooleanField("Manual Code", default=False) 
    code   = models.TextField("Code") 

admin.py

class MyAdAdminForm(forms.ModelForm): 
    class Meta: 
     model = Ad 

    def clean(self): 
     cleaned_data = self.cleaned_data 
     cleaned_data['code'] = "dadad" 
     print cleaned_data 
     return cleaned_data 

class AdAdmin(admin.ModelAdmin): 
    form = MyAdAdminForm 

admin.site.register(Ad, AdAdmin) 

は最終的に私はその全体の「コード」フィールドを生成したいが、私はまだフィールドが空の管理者にエラーを取得していますシェルの値(「ダダード」)を見ることができます。

私も

def clean_code(self): 

を試してみましたが、それがすべてでその関数を呼び出していませんでした。

と私はまた、AdAdminクラスの

def save_model(request,....): 

を試してみましたが、それはどちらかそれを呼び出していませんでした。

どうすればよいですか?

+0

MyAdAdminFormの一部としてインデントを1レベル作成する必要はありませんか? – jpic

+0

私のコードでは、ここで修正します。 –

答えて

2

カスタムcleanメソッドを呼び出すだけでなく、Djangoは各フォームフィールドを個別に検証します。必要なフィールドエラーを引き起こすのは個々のフィールドチェックです。詳細については、DjangoのドキュメントForm and field validationを参照してください。

コードフィールドにユーザー入力を必要としない場合は、フォームの__init__メソッドをオーバーライドし、required=Falseと設定できます。フィールドは必須ではありません一度あなたがそこに値を設定することができるように

class MyAdAdminForm(forms.ModelForm): 
    class Meta: 
     model = Ad 

    def __init__(self, *args, **kwargs): 
     super(MyAdAdminForm, self).__init__(*args, **kwargs) 
     self.fields['code'].required = False 

は、フォーム、検証中clean_codeメソッドを呼び出します。

+0

私は必要なフィールドを維持したかった。それは全体の問題でした。 –

+0

私が理解しているように、あなたは自動的に 'code'フィールドの値を生成しているので、ユーザがコードを入力する必要はありません。したがって、このフォームではfalseが必要です。ユーザーが値を入力する必要がある場合は、ユーザーが値を入力しなかったときにエラーを表示することが正しい動作であるようです。 – Alasdair

+0

'manual_code'がチェックされていれば、フィールドの値を生成しないかもしれません。ユーザーがそれをチェックして 'code'の値を挿入しなかった場合、エラーを返します。 –

関連する問題