You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 00:31:39