I have many different filters in Django admin:
class OrderAdmin(admin.ModelAdmin):
...
list_filter = (\'field_1\', \'field_2\', \'field_3\', ... , \'
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']