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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 06:53:29