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中的过滤器?
回答我自己的问题......这就是我得到我想要的东西(沿着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>"]