2016-04-07 69 views
3

我在Django管理許多不同的過濾器:如何在django admin中獲得過濾的查詢集?

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

我需要過濾的queryset在我重寫的方法changelist_viewchangelist_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_viewsuper之前調用get_queryset它返回沒有過濾器的queryset。

回答

5

新版本的Django admin使用自定義對象的ChangeList視圖與自定義get_queryset方法。

正如你可以在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