Django Admin如何按ticker与date字段分组并跳转对应详情列表
解决方案
完全可以实现,无需新增额外模型,仅需修改IncomeStatementQuarterlyAdmin的逻辑即可,核心思路是:无过滤参数时展示去重后的ticker+date分组链接,点击跳转携带过滤参数的原生Admin列表页,自动筛选对应分组下的所有数据行。
完整修改后的admin.py代码
from django.contrib import admin from django.urls import reverse from django.utils.html import format_html from .models import IncomeStatementQuarterly @admin.register(IncomeStatementQuarterly) class IncomeStatementQuarterlyAdmin(admin.ModelAdmin): search_fields = ['ticker'] list_display_links = ('ticker',) # 自定义分组链接列 def statement_group(self, obj): # 注意将下方your_app_name替换为你的Django应用实际名称 base_url = reverse('admin:your_app_name_incomestatementquarterly_changelist') # 兼容字典(去重查询结果)和模型实例两种返回格式 ticker = obj['ticker'] if isinstance(obj, dict) else obj.ticker date_val = obj['date'] if isinstance(obj, dict) else obj.date # 拼接过滤参数 filter_params = f'?ticker={ticker}&date={date_val}' return format_html('<a href="{}">{} | {}</a>', base_url + filter_params, ticker, date_val.strftime('%b %d, %Y')) statement_group.short_description = '财报分组' # 根据是否有过滤参数动态返回展示列 def get_list_display(self, request): if request.GET.get('ticker') or request.GET.get('date'): return ("ticker", "date", "statement", "line_item", 'amount') return ('statement_group',) # 根据是否有过滤参数动态返回查询集 def get_queryset(self, request): qs = super().get_queryset(request) # 无过滤参数时返回去重的ticker+date组合 if not request.GET.get('ticker') and not request.GET.get('date'): return qs.values('ticker', 'date').distinct().order_by('ticker', 'date') return qs # 根据是否有过滤参数动态返回过滤器 def get_list_filter(self, request): if request.GET.get('ticker') or request.GET.get('date'): return ('line_item',) return [] # 根据是否有过滤参数动态返回日期层级导航 def get_date_hierarchy(self, request): if request.GET.get('ticker') or request.GET.get('date'): return 'date' return None def has_add_permission(self, request, obj=None): return False def has_delete_permission(self, request, obj=None): return False def has_change_permission(self, request, obj=None) -> bool: return False
注意事项
- 请将代码中
your_app_name替换为你当前注册IncomeStatementQuarterly模型的Django应用名称 - 如果日期过滤不生效,可以将参数
date替换为date__date适配不同数据库的日期字段匹配规则 - 该方案完全复用Django Admin原生的过滤、搜索、分页能力,无需额外开发模板或视图
内容的提问来源于stack exchange,提问作者Paul Marmagne
相关产品推荐
相关产品推荐

