Django show list filter only if condition matches

hof1towb  于 2023-06-25  发布在  Go
关注(0)|答案(1)|浏览(112)

我想在Django管理员中显示特定的列表过滤器,只有当某个条件匹配时。例如,我现在有3个过滤器:countrystatecity。所有这3个被显示在同一时间产生一个真正的混乱和一个非常长的侧边栏,因为它结合了一长串的城市,州和国家。
我想做的是只显示国家第一,当一个国家被点击,我想显示在该国的国家和城市过滤器相同。这是默认情况下可行的,还是我必须自己创建一个自定义过滤器?

list_filter = (
    ('loc_country_code', custom_titled_filter( 'country' )),
    ('loc_state', custom_titled_filter( 'state' )),
    ('loc_city', custom_titled_filter( 'city' )),
)
ewm0tg9j

ewm0tg9j1#

您可以创建一个自定义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, ...]

相关问题