How to get filtered queryset in django admin?

前端 未结 1 430
误落风尘
误落风尘 2020-12-16 17:38

I have many different filters in Django admin:

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


        
相关标签:
1条回答
  • 2020-12-16 18:09

    New version of Django admin use custom objects for ChangeList view with custom get_queryset method.

    As you can see in Django source:

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

    You must override self.get_changelist(request) and return your custom ChangeList with overridden 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 讨论(0)
提交回复
热议问题