如何在Django Admin的Company Year修改页跳转至同公司的其他Company Year页
在Django Admin的CompanyYear修改页直接切换同公司的其他年份记录
这个需求确实能大幅提升操作效率,不用绕到Company页面再跳转,我给你两种可行的实现方案,你可以根据自己的偏好选择:
方案一:在表单中添加只读字段显示跳转链接(无需修改模板)
这种方法最简单,直接在CompanyYearAdmin里定义一个自定义只读字段,生成同公司其他年份的修改页链接:
1. 先确认你的CompanyYear模型(补全外键字段)
from django.db import models class Company(models.Model): name = models.CharField(max_length=50) class CompanyYear(models.Model): company = models.ForeignKey(Company, on_delete=models.CASCADE, related_name="years") year = models.IntegerField() # 你的其他业务字段,比如营收、利润等
2. 自定义CompanyYearAdmin类
from django.contrib import admin from django.urls import reverse from .models import CompanyYear class CompanyYearAdmin(admin.ModelAdmin): # 配置你需要显示/编辑的字段 fields = ('company', 'year', 'related_year_links',) # 把自定义字段加进去 readonly_fields = ('related_year_links',) # 设置为只读 def related_year_links(self, obj): # 获取当前公司下的所有其他CompanyYear记录,排除当前条目,按年份倒序排列 related_years = CompanyYear.objects.filter(company=obj.company).exclude(id=obj.id).order_by('-year') if not related_years: return "暂无同公司的其他年份记录" # 生成每个年份的跳转链接 link_list = [] for year_entry in related_years: change_url = reverse( 'admin:your_app_name_companyyear_change', # 替换成你的实际app名称 args=[year_entry.id] ) link_list.append(f'<a href="{change_url}">{year_entry.year} 年</a>') # 用换行分隔链接 return '<br>'.join(link_list) # 自定义字段的显示名称 related_year_links.short_description = "同公司其他年份" # 允许渲染HTML标签 related_year_links.allow_tags = True # 注册Admin admin.site.register(CompanyYear, CompanyYearAdmin)
注意:把your_app_name替换成你实际的Django应用名称(比如你的app叫corporate,就写成admin:corporate_companyyear_change)。
方案二:在Admin页面的工具条添加下拉菜单(更贴合Admin UI风格)
如果希望跳转链接更贴近Django Admin的原生操作体验,可以修改页面模板,在顶部的对象工具条里加一个下拉菜单:
1. 自定义CompanyYearAdmin传递额外上下文
from django.contrib import admin from .models import CompanyYear class CompanyYearAdmin(admin.ModelAdmin): fields = ('company', 'year',) # 你的常规字段 def change_view(self, request, object_id, form_url='', extra_context=None): extra_context = extra_context or {} # 获取当前正在编辑的CompanyYear对象 current_entry = self.get_object(request, object_id) if current_entry: # 获取同公司的其他年份记录 related_years = CompanyYear.objects.filter(company=current_entry.company).exclude(id=object_id).order_by('-year') extra_context['related_years'] = related_years # 调用父类方法,传递额外上下文 return super().change_view(request, object_id, form_url, extra_context) admin.site.register(CompanyYear, CompanyYearAdmin)
2. 创建自定义模板文件
在你的Django项目中,创建模板路径:templates/admin/your_app_name/companyyear/change_form.html,内容如下:
{% extends "admin/change_form.html" %} {% block object-tools-items %} <!-- 保留原生的工具按钮(比如保存、删除) --> {{ block.super }} {% if related_years %} <li> <a href="#" class="dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> 切换同公司年份 </a> <ul class="dropdown-menu"> {% for year_entry in related_years %} <li> <a href="{% url 'admin:your_app_name_companyyear_change' year_entry.id %}"> {{ year_entry.year }} 年 </a> </li> {% endfor %} </ul> </li> {% endif %} {% endblock %}
同样,记得把your_app_name替换成实际的应用名称。
两种方案都能实现你要的效果:在CompanyYear修改页直接跳转到同公司的其他年份修改页,不用经过Company页面。方案一快速上手,方案二更符合Admin的操作习惯,你可以按需选择~
内容的提问来源于stack exchange,提问作者Andreas
相关产品推荐
相关产品推荐

