2012-01-22 8 views
4

私は、要素がアクティブかどうかを設定するためのオプションがあるモデルを持っています。リスト表示フォームでカスタム検証を追加する方法

"アクティブ"プロパティに "True"値を設定できる要素の数には制限があります。

AdminModelに検証コードを記述しました。今、elemntを編集して "active"とマークし、 "actvie"要素の限界に達している場合、私は例外を発生させます。

def clean_active(self): 
    if self.cleaned_data["active"]: 
     #check number of active elements in model. 

私はまた、私はオブジェクトのリストを持っています。 list_display =( '名前'、 'first_promotion'、 'second_promotion'、 'active') readonly_fields = ['name'] list_editable = ['アクティブ' ]

私が欲しいのは、この検証をモデルの "リスト表示"でも行うことができることです。 リスト表示の検証コードをどこに追加する必要がありますか。

誰でも私にこれを行う方法を教えてもらえますか? ありがとうございます。

答えて

5

良い質問!チェンジリスト形式はModelAdmin.get_changelist_formから引き出されており、ModelFormをモデルフォームセットのベースモデルとして提供することができます。

class MyForm(forms.ModelForm): 
    def clean_active(self): 
     cd = self.cleaned_data.get('active') 
     limit = 5 # replace with logic 
     if cd >= limit: 
      raise forms.ValidationError("Reached limit") 
     return cd 

    class Meta: 
     model = MyModel 

class MyModelAdmin(admin.ModelAdmin): 
    def get_changelist_form(self, request, **kwargs): 
     return MyForm 

あなたがフォームセットの検証(フォームのコレクション)を変更したい場合は、get_changelist_formset

from django.forms.models import BaseModelFormSet 

class BaseFormSet(BaseModelFormSet): 
    def clean(self): 
     print self.cleaned_data 
     # this is the cleaned data for ALL forms. 
     if 'your_condition': 
      raise forms.ValidationError("Your error") 

     return self.cleaned_data 

class MyModelAdmin(admin.ModelAdmin): 
    def get_changelist_formset(self, request, **kwargs): 
     kwargs['formset'] = BaseFormSet 
     return super(MyModelAdmin, self).get_changelist_formset(request, **kwargs) 
+0

おかげで多くのことをオーバーライドすると思います。それは本当に速い答えです。私は、単一のオブジェクト管理者で使用していたのと同じ "modelform"を使用しています。今私はアクティブなすべてのフィールドでエラーが発生しています(onece私は限界を過ぎた)。私はこれをtweekすることができますので、私はちょうど私が – sandok

+0

を編集した行をエラー表示して、 "true"または "false"の値が同じか変更されている場合、 "active"保存された値から? – sandok

+0

私はちょうどデータベース対比較するかもしれません... 'if self.instance.id:changed = self.model.objects.get(id = self.instance.id).active!= self.cleaned_data.get( 'active' ) 'IIRCモデルフォームはGETを行わないので、投稿されたデータから直接値を入力し始めます... –

関連する問題