首页 > 解决方案 > Dhango 1.11 如何过滤一个过滤器的内容?

问题描述

Django 1.11 Python 3.6

我有两个模型,一个是使用另一个模型列表的下拉过滤器,并且一切正常:

models.py

class Office(models.Manager):
      ...code....

class Customer(models.Manager):
      ...code....   
    office = models.ForeignKey(Office, blank=False, null=False)
      ...code....   
admin.py

class CustomerAdmin( admin.ModelAdmin):
    list_filter = ["office", "<some_other_filter>"]

就像我想要的那样,我在客户视图中获得了一个包含办公室列表的下拉列表,一切正常。

现在,无论出于何种原因,我想在客户视图上过滤“办公室”过滤器的内容,例如从该下拉列表中删除一些条目,但仅用于过滤器 - 办公室视图数据应该保持不变,即完整列表。覆盖get_querysetclass Office没有这样做,实际上,它与我需要的相反 - 它只过滤输入视图的数据,而不是过滤器中的条目列表。在 Django 1.11 中过滤过滤器是否有干净简单的方法?

标签: djangofiltermodeladmin

解决方案


回答我自己的问题......这是我得到我想要的东西的方式(沿着为 Django Admin 中的 list_filter 创建自定义过滤器):

in admin.py
from django.contrib.admin import SimpleListFilter
class MyCustomFilter(SimpleListFilter):
    title = '<some title>'
    parameter_name = '<some_entity>__id__exact'
    def lookups(self, request, model_admin):
        all_entries = model_admin.model.objects.all()
        filtered_entries = set([<bunch of code to do the filtering>])
        return set([(<dropdown_entry>.id, <dropdown_entry>.name) for entry in filtered_entries])

    def queryset(self, request, queryset):
        if self.value():
            return queryset.filter(tss_id=self.value())

        return queryset.all()

in models.py
class CustomerAdmin( admin.ModelAdmin):
    # list_filter = ["office", "<some_other_filter>"]
    list_filter = [MyCustomFilter, "<some_other_filter>"]


推荐阅读