Django后台:用admin_auto_filters实现联动自动补全下拉筛选
Django Admin联动筛选:用admin_auto_filters实现Funder与Scheme的联动自动补全
问题回顾
已通过smart-selects实现Project表单中Scheme下拉随Funder联动,但无法在Admin列表筛选区实现相同效果。使用Django原生SimpleListFilter可实现基础联动,但需要适配admin_auto_filters的自动补全功能。
解决方案
admin_auto_filters的AutocompleteFilter依赖Django的autocomplete视图,核心是重写其get_queryset方法来根据当前选中的Funder过滤选项,而非依赖SimpleListFilter的lookups逻辑。以下是完整实现:
完整代码实现
from django.contrib import admin from admin_auto_filters.filters import AutocompleteFilter from .models import Funder, Scheme, Project # Funder自动补全筛选 class FunderFilter(AutocompleteFilter): title = 'Funder' field_name = 'funder' # 联动的Scheme自动补全筛选 class SchemeAutocompleteFilter(AutocompleteFilter): title = 'Scheme' field_name = 'scheme' def get_queryset(self, request): # 获取当前选中的Funder ID(admin_auto_filters生成的默认参数名) funder_pk = request.GET.get('funder__pk__exact') qs = super().get_queryset(request) if funder_pk: # 根据选中的Funder过滤关联的Scheme qs = qs.filter(funders__pk=funder_pk).distinct() return qs def queryset(self, request, queryset): if self.value(): return queryset.filter(scheme__pk=self.value()).distinct() return queryset class ProjectAdmin(admin.ModelAdmin): search_fields = ['title', 'project_number'] # 筛选顺序必须是Funder在前,确保Scheme能获取到Funder的筛选参数 list_filter = [FunderFilter, SchemeAutocompleteFilter] # 配置autocomplete所需的字段搜索规则 autocomplete_fields = ['scheme'] admin.site.register(Funder) admin.site.register(Scheme) admin.site.register(Project, ProjectAdmin)
关键说明
- 核心逻辑差异:
admin_auto_filters的AutocompleteFilter不依赖lookups生成选项,而是通过get_queryset获取数据源,这是之前尝试失败的核心原因。 - 参数传递:通过
request.GET.get('funder__pk__exact')获取Funder的筛选参数,这是admin_auto_filters生成的默认参数格式。 - 字段配置:必须在
ProjectAdmin中配置autocomplete_fields = ['scheme'],否则自动补全功能无法生效。 - 筛选顺序:Funder筛选必须放在Scheme筛选前面,确保页面刷新时Scheme能读取到Funder的筛选状态。
内容的提问来源于stack exchange,提问作者HBMCS
相关产品推荐
相关产品推荐

