2015-10-29 9 views
7

オブジェクトごとにlist_editableをオプションにすることはできますか?たとえば、readonly fields属性にはこのオプションがあり、changelist_viewには影響しません。Django条件付き管理者リスト_編集可能

class MyAdmin(admin.ModelAdmin): 
    readonly_fields = ('foo',) 

    def get_readonly_fields(self, request, obj=None): 
     fields = super(MyAdmin, self).get_readonly_fields(request, obj=obj) 

     if obj.status == 'CLOSED': 
      return fields + ('bar',) 
     return fields 

list_displayおよび他の属性についても同じことが達成できます。メソッド 'get_list_editable_fields'がないようです。

私はいくつかの行が明らかに不変であることを望みますが、下品なエラーを起こす以外は動作していないようです。属性についてのドキュメントが見つかりませんでした

何とかlist_displayゲッターでウィジェットをレンダリングすることは可能でしょうか?

class MyAdmin(admin.ModelAdmin): 
    list_display = ('get_bar',) 
    list_editable = ('get_bar',) 

    def get_bar(self, obj): 
     return widget or str(obj.bar) # ??? 
    get_bar.allow_tags = True 

Alasdairのフィードバックを使用して、更新:

def get_changelist_formset(self, request, **kwargs): 
    """ 
    Returns a FormSet class for use on the changelist page if list_editable 
    is used. 
    """ 
    # I run through this code for each row in the changelist, but there's nothing in kwargs, so I don't know how to use the instance as a guide to which fields should be in list_editable? 

    defaults = { 
     "formfield_callback": partial(self.formfield_for_dbfield, request=request), 
    } 
    defaults.update(kwargs) 
    return modelformset_factory(
     self.model, self.get_changelist_form(request), extra=0, 
     fields=self.list_editable, **defaults 
    ) 

答えて

1

あなたが言うように、何のget_list_editable方法はありません。

get_changelist_formsetメソッドをオーバーライドしてください。あなたはメソッド全体を複製し、渡されたフィールドのリストをmodelformset_factoryに変更する必要があると思います。

+0

を、私はそれぞれの行のためのメソッドを介して実行されますが、kwargsからです空の?私の更新された質問を参照してください – trb

+0

私は答えが何であるか分かりません、あなたは管理コードのかなり深いです!/get_changelist_formをオーバーライドする必要があるかもしれません。がんばろう! – Alasdair

+0

これは正しい軌道に乗ってくれました。私は管理者にモデルを2回登録することになりました(プロキシモデルのハックが必要です)。独自の管理ルールセットを作成しました。この要件は本当にdjango管理者の境界を打つ:-) – trb

0

また、あなたがchangelist_viewをオーバーライドし、そのようなこと行うことができます:私はこの方法では、現在のインスタンスを取得する方法を理解していない

def changelist_view(self, request, extra_context=None): 
     resp = super(CustomModelAdmin, self).changelist_view(request, extra_context) 
     if something: 
      resp.context_data['cl'].formset = None 

     return resp 
関連する問題