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

