2016-04-07 7 views
3

私はDjangoの管理者には多くの異なるフィルタを持っている:django adminでフィルタリングされたquerysetを取得するには?

class OrderAdmin(admin.ModelAdmin): 
    ... 
    list_filter = ('field_1', 'field_2', 'field_3', ... , 'field_N') 
    ... 

私は親changelist_viewが呼び出される前に、私のオーバーライドされたメソッドchangelist_viewでクエリセットをフィルタ取得する必要があります。

class OrderAdmin(admin.ModelAdmin): 
    ... 
    def changelist_view(self, request, extra_content=None): 
     # here i need filtered queryset and I don`t know 
     # which filters have been applied 
     return super().changelist_view(request, extra_context) 
    ... 

私はchangelist_viewsuperget_querysetを呼び出す場合フィルターなしでクエリーセットを返します。

答えて

5

Django管理者の新しいバージョンでは、カスタムのget_querysetメソッドを使用してChangeListビュー用のカスタムオブジェクトを使用しています。

あなたはDjangoのソースに見ることができるように:

def changelist_view(self, request, extra_context=None): 
    ... 
    ChangeList = self.get_changelist(request) 

    cl = ChangeList(request, self.model, list_display, 
     list_display_links, list_filter, self.date_hierarchy, 
     search_fields, list_select_related, self.list_per_page, 
      self.list_max_show_all, self.list_editable, self) 

    # Actions with no confirmation 
    if (actions and request.method == 'POST' and 
      'index' in request.POST and '_save' not in request.POST): 
     if selected: 
      response = self.response_action(request, queryset=cl.get_queryset(request)) 
    ... 

あなたはself.get_changelist(request)をオーバーライドし、オーバーライドされたget_querysetでカスタムチェンジを返さなければなりません。

ModelAdmin.get_changelist

def get_changelist(self, request, **kwargs): 
    """ 
    Returns the ChangeList class for use on the changelist page. 
    """ 
    return MyChangeList # PUT YOU OWERRIDEN CHANGE LIST HERE 

MyChangeList

from django.contrib.admin.views.main import ChangeList 

class MyChangeList(ChangeList): 
    def get_queryset(...): 
     # if you want change get_queryset logic or add new filters 
     ... 
    def __init__(self, *args, **kwargs): 
     super().__init__(*args, **kwargs) 
     # if you want add some context variable which can be accessed by 
     # {{ cl.some_context_varibale }} variable 
     self.some_context_varibale = self.queryset.aggregate(Avg('price'))['price__avg'] 
+0

まさに私が必要なもの、ありがとう! – react