如何配置Django admin让列表页外键显示为指向关联对象的链接?
实现方案
Django admin 没有原生全局配置项可以直接开启该效果,你可以通过自定义通用 Admin Mixin 实现需求,无需重复编写每个模型的配置逻辑。
- 第一步:定义通用外键链接转换 Mixin
from django.urls import reverse from django.utils.html import format_html class ForeignKeyLinkMixin: def __getattribute__(self, item): attr = super().__getattribute__(item) # 匹配link_开头的动态字段方法 if item.startswith('link_'): field_name = item[5:] def inner(obj): related_obj = getattr(obj, field_name) if not related_obj: return '-' # 生成关联对象Admin详情页的路由 url = reverse( f'admin:{related_obj._meta.app_label}_{related_obj._meta.model_name}_change', args=[related_obj.pk] ) return format_html('<a href="{}">{}</a>', url, str(related_obj)) inner.short_description = field_name.replace('_', ' ').title() return inner return attr def get_list_display(self, request): original_list_display = super().get_list_display(request) new_list_display = [] for field in original_list_display: # 识别外键字段,替换为链接生成方法 try: if self.model._meta.get_field(field).many_to_one: new_list_display.append(f'link_{field}') continue except: pass new_list_display.append(field) return new_list_display
- 第二步:给需要开启该功能的 ModelAdmin 继承该 Mixin 即可
from django.contrib import admin from .models import YourModel @admin.register(YourModel) class YourModelAdmin(ForeignKeyLinkMixin, admin.ModelAdmin): # 原有配置无需修改,list_display正常填写外键字段即可 list_display = ['id', 'name', 'foreign_key_field1', 'foreign_key_field2', 'create_time']
额外说明
- 若需要指定部分外键不转为链接,可在Mixin中新增
fk_link_exclude配置项,在字段替换逻辑中增加排除判断即可 - 该实现不会影响原有
list_display_links等Admin配置,也无需修改模型层代码
内容的提问来源于stack exchange,提问作者AlwaysLearning
相关产品推荐
相关产品推荐

