2016-04-07 16 views
3

Django yönetici birçok farklı filtreler vardır:Filtre uygulanmış queryset django admin'e nasıl alınır?

Ben denir ebeveyn changelist_view önce benim geçersiz kılınan yöntemde changelist_view yılında Sorgu Kümesi filtreden almak gerekir
class OrderAdmin(admin.ModelAdmin): 
    ... 
    list_filter = ('field_1', 'field_2', 'field_3', ... , 'field_N') 
    ... 

: Ben changelist_view içinde super önce get_queryset arayarak eğer

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) 
    ... 

filtreler olmadan queryset'i döndürür.

cevap

5

Django yöneticisinin yeni sürümü, özel get_queryset yöntemiyle ChangeList görünümü için özel nesneler kullanır.

Django kaynağında da görebileceğiniz gibi:

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)) 
    ... 

Sen self.get_changelist(request) geçersiz kılmak ve geçersiz kılınmış get_queryset ile özel changeList dönmelidir.

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

tam ihtiyacım olan şey, teşekkürler! – react