如何在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
相关产品推荐
相关产品推荐

