在Django Admin面板的筛选区为特定对象类型添加搜索栏
在Django Admin筛选区添加对象类型搜索功能
方法一:原生自定义Filter(无需插件)
如果你不想依赖第三方包,可以通过自定义SimpleListFilter实现带搜索框的筛选:
- 创建自定义Filter类
在你的app的admin.py中添加:
from django.contrib import admin from django.utils.translation import gettext_lazy as _ class ObjectTypeSearchFilter(admin.SimpleListFilter): title = _('对象类型') parameter_name = 'object_type' # 空返回lookups,用搜索框替代选项列表 def lookups(self, request, model_admin): return () # 处理筛选逻辑 def queryset(self, request, queryset): search_value = self.value() if search_value: return queryset.filter(object_type__icontains=search_value) return queryset # 指定自定义模板路径 def template(self): return 'admin/object_type_search_filter.html'
- 创建筛选模板
在项目templates/admin/目录下新建object_type_search_filter.html:
{% load i18n %} <h3>{{ title }}</h3> <div class="choices"> <input type="text" name="{{ parameter_name }}" value="{{ value|default:'' }}" placeholder="{% trans '搜索对象类型...' %}" style="width: 100%; margin-bottom: 8px;"> <button type="submit" class="button" style="margin-right: 8px;">{% trans '搜索' %}</button> {% if value %} <a href="{{ request.get_full_path|remove_param:parameter_name }}" class="button">{% trans '清除' %}</a> {% endif %} </div>
- 添加模板标签处理清除链接
在app的templatetags/目录下新建remove_param.py(无此目录则创建,同时添加__init__.py文件):
from django import template from urllib.parse import urlparse, parse_qs, urlencode register = template.Library() @register.filter def remove_param(url, param): parsed_url = urlparse(url) query_params = parse_qs(parsed_url.query) query_params.pop(param, None) new_query = urlencode(query_params, doseq=True) base_url = f"{parsed_url.scheme}://{parsed_url.netloc}{parsed_url.path}" return f"{base_url}?{new_query}" if new_query else base_url
- 在ModelAdmin中启用Filter
修改你的ModelAdmin配置:
class YourModelAdmin(admin.ModelAdmin): list_filter = (ObjectTypeSearchFilter,)
方法二:使用第三方插件(快捷实现)
如果想快速完成功能,可以用专门的第三方包django-admin-list-filter-search:
- 安装包
pip install django-admin-list-filter-search
- 配置Filter
在admin.py中:
from django.contrib import admin from admin_list_filter_search import AutocompleteFilter class ObjectTypeFilter(AutocompleteFilter): title = _('对象类型') parameter_name = 'object_type' # 自动补全URL格式:admin:你的模型名_字段名_autocomplete autocomplete_url = 'admin:yourmodel_object_type_autocomplete' class YourModelAdmin(admin.ModelAdmin): list_filter = (ObjectTypeFilter,) # 启用字段自动补全 autocomplete_fields = ['object_type']
- 配置URL(部分版本可自动生成,按需添加)
在项目urls.py中添加自动补全路由:
from django.urls import path from django.contrib.admin import site urlpatterns = [ path('admin/', site.urls), path('admin/yourapp/yourmodel/object_type/autocomplete/', admin.views.autocomplete, name='admin:yourmodel_object_type_autocomplete'), ]
注意事项
- 自定义Filter的样式可根据需求调整,保持和Django Admin风格一致
- 第三方插件需注意和你的Django版本兼容,安装前查看官方文档说明
内容的提问来源于stack exchange,提问作者stackoverflow1234
相关产品推荐
相关产品推荐

