from django.contrib import admin
class MultiSelectFilter(admin.SimpleListFilter):
# Filter title
title = 'Cities'
# model field
parameter_name = 'city_name'
def lookups(self, request, model_admin):
# you can modify this part, this is less DRY approach.
# P.S. assuming city_name is lowercase CharField
return (
('city1,city2,city3', 'City1 or City2 or City3'),
('city4,city5,city6', 'City3 or City4 or City6'),
)
def queryset(self, request, queryset):
if self.value() in ('city1,city2,city3', 'city4,city5,city6'):
# filter if a choice selected
return queryset.filter(city_name__in=self.value().split(','))
# default for no filtering
return queryset
class PersonFilterSet(django_filters.FilterSet):
city = django_filters.ModelMultipleChoiceFilter(
queryset=City.objects.all(),
label='Cities')
class Meta:
model = Person
fields = ('city',)
@admin.register(Person)
class PersonAdmin(ModelAdmin):
list_filter = form_filter_factory(PersonFilterSet),
5条答案
按热度按时间km0tfn4u1#
您可以使用AllValuesFieldListFilter中内置的稍做修改的版本:
字符串
值中的转义逗号也应该实现,但我不需要它。
(使用Django 2.2.5测试)
9udxz4iz2#
您可以使用这个新工具django-admin-multiple-choice-list-filter。
4uqofj5v3#
对于那些更愿意使用外部库的人来说,这些库似乎在撰写本文时得到了维护(最近6个月内的发布):
django-more-admin-filters:添加了几个过滤器类,包括多选和下拉过滤器
django-advanced-filters:添加了一个高级过滤器mixin,它可以显示一个模式,以构建由和/或组合的多个条件的查询
与问题无关,但也是一个很好的发现:
django-admin-autocomplete-list-filter:使自动完成列表过滤器成为可能
9o685dep4#
你可以通过继承
django.contrib.admin.SimpleListFilter
来使用Django自定义list_filter下面是一个简单的例子:
字符串
您在此处有文档的引用
lsmepo6l5#
也可以使用django-filter包实现多个选择过滤器:
字符串
这个解决方案更好,因为许多Django项目已经使用了django-filter包,所以只需要管理过滤器就不需要额外的依赖。