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

如何在Django Admin中结合JavaScript Flatpickr创建自定义过滤器

在Django Admin中基于Flatpickr实现自定义日期过滤器

1. 编写自定义Admin过滤器类

创建继承自admin.SimpleListFilter的过滤器类,重写核心方法来处理日期范围的参数读取与数据过滤:

from django.contrib import admin
from django.utils.translation import gettext_lazy as _

class FlatpickrDateRangeFilter(admin.SimpleListFilter):
    title = _('日期范围')
    # 指定模板路径,后续会自定义这个模板
    template = 'admin/filter/flatpickr_date_range.html'

    def lookups(self, request, model_admin):
        # 不需要返回固定选项,完全用Flatpickr的自定义输入替代
        return ()

    def queryset(self, request, queryset):
        # 从GET请求中提取日期参数
        start_date = request.GET.get('start_date')
        end_date = request.GET.get('end_date')
        
        # 根据参数过滤数据集(替换成你的模型日期字段,比如created_at)
        if start_date and end_date:
            return queryset.filter(created_at__range=(start_date, end_date))
        elif start_date:
            return queryset.filter(created_at__gte=start_date)
        elif end_date:
            return queryset.filter(created_at__lte=end_date)
        return queryset

2. 在ModelAdmin中注册过滤器

将自定义过滤器添加到目标模型的Admin配置里:

from django.contrib import admin
from .models import YourTargetModel
from .filters import FlatpickrDateRangeFilter

@admin.register(YourTargetModel)
class YourTargetModelAdmin(admin.ModelAdmin):
    list_display = ('id', 'name', 'created_at')
    # 注册自定义日期过滤器
    list_filter = (FlatpickrDateRangeFilter,)

3. 自定义过滤器模板

在项目的templates目录下创建admin/filter/flatpickr_date_range.html,嵌入Flatpickr的输入框与初始化逻辑:

{% load i18n %}
<h3>{% blocktrans with filter_title=title %}按{{ filter_title }}筛选{% endblocktrans %}</h3>
<div class="date-range-filter">
    <input type="text" id="start_date" name="start_date" 
           placeholder="开始日期" value="{{ request.GET.start_date }}">
    <span>至</span>
    <input type="text" id="end_date" name="end_date" 
           placeholder="结束日期" value="{{ request.GET.end_date }}">
    <button type="submit" class="button">{% trans '确认筛选' %}</button>
</div>

<script>
document.addEventListener('DOMContentLoaded', function() {
    // 初始化Flatpickr日历(按需调整配置)
    flatpickr("#start_date", {
        dateFormat: "Y-m-d",
        allowInput: true,
        locale: "zh"
    });
    
    flatpickr("#end_date", {
        dateFormat: "Y-m-d",
        allowInput: true,
        locale: "zh"
    });
});
</script>

4. 确保Flatpickr资源加载

在ModelAdmin中通过Media类引入Flatpickr的CSS和JS(如果之前没全局引入的话):

class YourTargetModelAdmin(admin.ModelAdmin):
    # 其他配置...
    class Media:
        css = {
            'all': ('flatpickr/flatpickr.min.css',)
        }
        js = (
            'flatpickr/flatpickr.min.js',
            'flatpickr/l10n/zh.js',  # 中文语言包
        )

关键细节说明

  • 替换代码中的created_at为你模型实际的日期/时间字段名
  • 如果需要支持时间范围,修改Flatpickr的dateFormat为Y-m-d H:i,同时调整过滤逻辑为datetime字段的范围匹配
  • 模板中通过request.GET.start_date实现筛选后参数回显,保持筛选状态

内容的提问来源于stack exchange,提问作者Franco Ribarov

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 21:12:39