2017-02-02 12 views
1

ModelAdmin.get_fields()と同様に、サブクラスに項目を追加できるような他のヘルパー関数もありますが、これはfilter_horizo​​ntalに対して可能ですか?現時点では私は、それぞれの子adminクラスに手動で再書き込みリストにありますDjangoで親のfilter_horizo​​ntalに追加admin

BaseAdminClass(admin.ModelAdmin): 
    ... 
    fields = ['some_field', 'many_to_many_field'] 
    filter_horizontal = ['many_to_many_field'] 


ChildAdminClassOne(admin.ModelAdmin): 
    def get_fields(self, request, obj=None): 
     fields = super(ChildAdminClass, self).get_fields(request, obj) 
     return fields + ['another_field'] 

    # Something like get_filter_horizontal()? 
    filter_horizontal = ['many_to_many_field' + 'another_field'] 


ChildAdminClassTwo(admin.ModelAdmin): 
    def get_fields(self, request, obj=None): 
     fields = super(ChildAdminClass, self).get_fields(request, obj) 
     return fields + ['other_field'] 

    filter_horizontal = ['many_to_many_field' + 'other_field'] 

答えて

1

あなたも、より便利fieldsよりもそれを行うことができます。クラス属性をプロパティで上書きするだけです。私はちょうど私が単に各サブクラスでこれを行うことができます実現

class BaseAdminClass(admin.ModelAdmin): 
    fields = ['some_field', 'many_to_many_field'] 
    default_filter_horizontal = ['many_to_many_field'] 
    additional_filter_horizontal = [] 

    @property 
    def filter_horizontal(self): 
     return self.default_filter_horizontal + self.additional_filter_horizontal 

class ChildAdminClass(BaseAdminClass): 
    fields = ['some_field', 'many_to_many_field'] 
    additional_filter_horizontal = ['other_field'] 
+0

そして、私は 'fields'を属性と同じだろう。 – Raz

+0

あなたの解決策にはタイプミスがあります: 'return self.default_filter_horizo​​ntal + self.additional_filter_horizo​​ntal'これは正解として受け入れられましたが、新しい任意のフィールド名を追加するというのは本当に嫌いです(すなわちadditional_filter_horizo​​ntal、default_filter_horizo​​ntal) 。これはコードを見ている誰かには分かりません。また、サブクラスごとにfilter_horizo​​ntalフィールドの順序を変更することはできません。 – silentz0r

0

BaseAdminClass(admin.ModelAdmin): 
    fields = ['some_field', 'many_to_many_field'] 
    filter_horizontal = ['many_to_many_field'] 

ChildAdminClassOne(admin.ModelAdmin): 
def get_fields(self, request, obj=None): 
     fields = super(ChildAdminClass, self).get_fields(request, obj) 
     return fields + ['another_field'] 

    # Something like get_filter_horizontal()? 
    filter_horizontal = BaseAdminClass.filter_horizontal + ['another_field'] 
+0

私はそれがより簡単な解決であることに同意します。しかし、子供の中の親クラスをハードコーディングするのは、通常は悪い習慣です。 「スーパー」と呼ぶほうがよい。 'ChildAdminClassOne'は' BaseAdminClass'から継承していると仮定します。 – Raz

関連する問題