Dhango 1.11如何过滤一个过滤器的内容?

时间:2019-04-15 08:55:19

标签: django filter model admin

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>"]

就像我想要的那样,我在“客户”视图上得到一个带有办公室列表的下拉列表,一切正常。

现在,无论出于何种原因,我都希望在“客户”视图上过滤“办公室”过滤器的内容,例如从该下拉列表中删除一些条目,但仅用于过滤器-Office视图数据应保持不变,即完整列表。在get_queryset中覆盖class Office并没有做到这一点,实际上,它的作用与我需要的相反-它仅过滤输入到视图的数据,而不过滤过滤器中的条目列表。在Django 1.11中,有没有一种清洁简便的方法来过滤过滤器?

1 个答案:

答案 0 :(得分:0)

回答我自己的问题... 这是我想要的方式(沿着Creating Custom Filters for list_filter in Django Admin的方式):

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>"]