您可以創建自定義SimpleListFilter
以在管理員上生成動態過濾器。在SimpleListFilter
中,如果lookups
方法返回一個空的元組/列表,則禁用過濾器(也從視圖中隱藏)。這可以用來控制何時出現某些過濾器。
這裏有一個基本的過濾器:
class CountryFilter(admin.SimpleListFilter):
title = 'Country'
parameter_name = 'country'
def lookups(self, request, model_admin):
""" Return a list of (country_id, country_name) tuples """
countries = Country.objects.all()
return [(c.id, c.name) for c in countries]
def queryset(self, request, queryset):
...
下面是其中的選擇是基於以上的過濾器限制的過濾器:
class StateFilter(admin.SimpleListFilter):
title = 'State'
parameter_name = 'state'
def lookups(self, request, model_admin):
"""
Return a list of (state_id, state_name) tuples based on
country selected
"""
# retrieve the current country the user has selected
country_id = request.GET.get('country')
if country_id is None:
# state filter will be hidden
return []
# only return states which belong in the country
states = State.objects.filter(country_id=country_id)
return [(s.id, s.name) for s in states]
def queryset(self, request, queryset):
...
的總體思路是使用你的過濾器類lookups
限制後續過濾器上的選項。這些過濾器可以通過list_filter
參數應用於管理員。
class MyAdmin(admin.ModelAdmin):
list_filter = [CountryFilter, StateFilter, CityFilter, ...]
究竟是我最終做了什麼。 –