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

Django Admin中如何给关联Training模型添加后台跳转普通超链接

解决方案

原生方案(无需自定义代码)

如果你可以接受raw_id_fields的输入框样式,直接在对应ModelAdmin中配置即可,Django原生就会为外键字段添加指向关联模型后台编辑页的超链接:

from django.contrib import admin
from .models import YourModel

class YourModelAdmin(admin.ModelAdmin):
    # 直接声明要使用raw_id样式的外键字段即可
    raw_id_fields = ('training',)

admin.site.register(YourModel, YourModelAdmin)

自定义声明式方案(可自定义展示样式,全局复用)

如果不需要raw_id的输入框样式,只想要纯文本超链接,可以封装通用Mixin实现声明式配置,一次定义多处使用:

1. 先定义通用Mixin类

from django.urls import reverse
from django.utils.html import format_html
from django.contrib import admin

class RelatedModelLinkMixin:
    # 子类重写该属性,填入需要生成超链接的关联字段名
    related_link_fields = []

    def __init__(self, model, admin_site):
        super().__init__(model, admin_site)
        # 自动为配置的关联字段生成渲染方法
        for field in self.related_link_fields:
            method = self._get_link_render_method(field)
            setattr(self, f"link_{field}", method)
            # 将生成的方法加入只读字段
            if f"link_{field}" not in self.readonly_fields:
                self.readonly_fields = [*self.readonly_fields, f"link_{field}"]

    def _get_link_render_method(self, field_name):
        def render_link(obj):
            related_instance = getattr(obj, field_name, None)
            if not related_instance:
                return "-"
            # 生成关联模型的Admin编辑页地址
            change_url = reverse(
                f"admin:{related_instance._meta.app_label}_{related_instance._meta.model_name}_change",
                args=(related_instance.pk,)
            )
            return format_html('<a href="{}">{}</a>', change_url, str(related_instance))
        # 设置字段显示名称和排序规则
        render_link.short_description = self.model._meta.get_field(field_name).verbose_name
        render_link.admin_order_field = field_name
        return render_link

2. 业务场景使用

在需要该功能的ModelAdmin中继承Mixin,声明要加超链接的关联字段即可:

class YourModelAdmin(admin.ModelAdmin, RelatedModelLinkMixin):
    # 声明要生成超链接的关联字段
    related_link_fields = ("training",)
    # 在fields/fieldsets中替换原字段为生成的link_字段即可(也可和原字段共存)
    fields = ("name", "link_training", "other_field")

配置完成后,training关联字段就会渲染为纯文本超链接,点击直接跳转到Training模型的编辑页,不会触发弹窗。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 08:06:06