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

如何在Django Admin中按字段过滤模型实例并追踪变更?

解决Django Admin按更新日期过滤模型实例的需求

嘿,我来帮你搞定这个需求!其实完全不用纠结新建ModelAdmin或者修改模板——Django Admin本身就自带了开箱即用的列表过滤功能,基础的日期过滤需求直接配置就能实现,超简单。

基础实现:直接用自带的日期过滤器

你已经注册了ModelAdmin,那只需要在这个ModelAdmin类里添加list_filter属性,指定你的更新日期字段就行。举个例子,假设你的模型叫YourModel,里面有个updated_at字段(推荐用auto_now=True让它自动记录更新时间):

from django.contrib import admin
from .models import YourModel

@admin.register(YourModel)
class YourModelAdmin(admin.ModelAdmin):
    # 这里是你已有的配置,比如要显示的字段
    list_display = ('id', 'title', 'updated_at')
    # 重点加这一行!指定按updated_at过滤
    list_filter = ('updated_at',)

配置完刷新Admin页面,你会看到页面右侧自动出现了日期过滤控件,用户可以选择「今天」「过去7天」「本月」「本年」,还能自定义日期范围,完全满足追踪变更记录的需求。

进阶:自定义日期过滤选项

如果自带的过滤选项不够用,比如你想加个「最近30天更新」的快捷选项,可以自定义过滤器:

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

class RecentUpdateFilter(DateFieldListFilter):
    def __init__(self, field, request, params, model, model_admin, field_path):
        super().__init__(field, request, params, model, model_admin, field_path)
        # 添加自定义的过滤链接
        self.links += (
            (_('最近30天'), {
                self.lookup_kwarg_since: (datetime.date.today() - datetime.timedelta(days=30)).strftime('%Y-%m-%d'),
            }),
        )

@admin.register(YourModel)
class YourModelAdmin(admin.ModelAdmin):
    list_display = ('id', 'title', 'updated_at')
    # 使用自定义的过滤器
    list_filter = (
        ('updated_at', RecentUpdateFilter),
    )

这样右侧的过滤栏里就会多一个「最近30天」的选项,用户点击就能快速筛选出这段时间更新的实例。

划重点:不需要额外操作

  • 不用新建ModelAdmin:直接在你已注册的那个类上扩展list_filter属性就行
  • 不用修改change_list.html:自带的过滤控件样式已经足够实用,除非你要做非常个性化的UI定制,否则完全没必要动模板

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 06:21:48