如何在Django Admin中添加多文本输入框筛选模型列表数据?
Django Admin 实现多文本输入框筛选
要在Django Admin中添加多个文本输入框用于筛选模型数据,你可以通过自定义SimpleListFilter类来实现,具体步骤如下:
1. 自定义文本筛选类
创建一个继承自SimpleListFilter的类,重写相关方法处理筛选逻辑并渲染自定义输入框:
from django.contrib.admin import SimpleListFilter from django.utils.translation import gettext_lazy as _ class MultiTextFilter(SimpleListFilter): title = _('文本筛选') # 筛选器显示标题 parameter_name = 'text_filters' # 占位参数名,不影响实际筛选逻辑 def lookups(self, request, model_admin): # 返回空元组,跳过默认下拉选项渲染 return () def queryset(self, request, queryset): # 从请求中获取输入框值,添加对应过滤条件 title_keyword = request.GET.get('title_filter') author_keyword = request.GET.get('author_filter') if title_keyword: queryset = queryset.filter(title__icontains=title_keyword) if author_keyword: queryset = queryset.filter(author__icontains=author_keyword) return queryset def template(self): # 指定自定义模板路径 return 'admin/multi_text_filter.html'
2. 创建筛选器模板
在项目或应用的templates/admin目录下创建multi_text_filter.html模板,渲染多个文本输入框和操作按钮:
{% load i18n %} <h3>{{ title }}</h3> <div class="form-row"> <label for="title_filter">{% trans '书名' %}:</label> <input type="text" name="title_filter" id="title_filter" value="{{ request.GET.title_filter|default:'' }}"> </div> <div class="form-row"> <label for="author_filter">{% trans '作者' %}:</label> <input type="text" name="author_filter" id="author_filter" value="{{ request.GET.author_filter|default:'' }}"> </div> <div class="form-row"> <button type="submit" class="button">{% trans '筛选' %}</button> {% if request.GET.title_filter or request.GET.author_filter %} <a href="{{ request.path }}" class="button">{% trans '重置' %}</a> {% endif %} </div>
3. 在ModelAdmin中注册筛选器
将自定义筛选器添加到目标模型的ModelAdmin配置中:
from django.contrib import admin from .models import Book @admin.register(Book) class BookAdmin(admin.ModelAdmin): list_display = ('title', 'author', 'publication_date') list_filter = (MultiTextFilter,)
扩展说明
- 若需新增筛选字段,只需在
queryset方法中添加对应字段的过滤逻辑,并在模板中新增输入框即可。 - 示例中使用
icontains做不区分大小写的模糊匹配,可根据需求替换为contains(区分大小写)、exact(精确匹配)等查询方式。
内容的提问来源于stack exchange,提问作者Yousef
相关产品推荐
相关产品推荐

