如何在 Django Admin 中为外键字段添加可点击的管理员链接
技术百科
碧海醫心
发布时间:2026-01-19
浏览: 次 django admin 默认不为 `foreignkey` 字段生成跳转至关联对象管理页的链接,但可通过自定义 `list_display` 方法结合 `reverse` 和 `format_html` 手动实现,同时推荐配合 `list_select_related` 优化查询性能。
在 Django Admin 中,当模型包含外键(如 MyLog.user 指向 CustomUser)时,直接将字段名(如

要实现点击用户名即可跳转到对应 CustomUser 的编辑页(即 /admin/myapp/customuser/1/change/),需定义一个带 HTML 链接的展示方法,并正确构造 admin URL:
from django.contrib import admin
from django.urls import reverse
from django.utils.html import format_html
@admin.register(MyLog)
class MyLogAdmin(admin.ModelAdmin):
list_display = ["id", "username_link"]
list_select_related = ["user"] # ⚡ 关键优化:避免 N+1 查询
@admin.display(ordering="user__username", description="User")
def username_link(self, obj):
if not obj.user:
return "-"
return format_html(
'{}',
reverse("admin:myapp_customuser_change", args=[obj.user.pk]),
obj.user.username or str(obj.user),
)⚠️ 注意事项:
- myapp 需替换为 CustomUser 所在应用的实际名称(如 accounts 或 users),可通过 CustomUser._meta.app_label 动态获取,但硬编码更清晰;
- 使用 obj.user.pk(而非 obj.user_id)更健壮,尤其在使用 UUIDField 或自定义主键时;
- list_select_related = ["user"] 是必备优化:它让 Django 在列表页查询中通过 JOIN 一次性获取外键数据,避免每行都触发额外数据库查询;
- 若 CustomUser 是自定义用户模型,请确保已在 settings.AUTH_USER_MODEL 中正确定义,并在 reverse() 中使用其对应 app 名,而非硬编码 'auth';
- @admin.display(ordering=...) 支持按关联字段排序(点击表头可升序/降序),提升用户体验。
最终效果:MyLog 列表页的 “User” 列将显示可点击的用户名,点击后直接进入该用户的编辑界面,完全复现了主流后台系统的便捷导航能力。
# 并在
# 可通过
# 该用户
# 自定义
# 跳转
# 而非
# app
# 已在
# go
# 对象
# html
# 编码
# 字符串
# 数据库
# Object
# display
# symfony
# 至关
# 升序
# django
# 不为
相关栏目:
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
AI推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
SEO优化<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
技术百科<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
谷歌推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
百度推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
网络营销<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
案例网站<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
精选文章<?muma echo $count; ?>
】
相关推荐
- php485在php5.6下能用吗_php485旧
- Win10系统怎么查看显卡温度_Win10任务管理
- Go 中 := 短变量声明的类型推导机制详解
- MAC如何修改默认应用程序_MAC文件后缀关联设置
- Win11怎样彻底卸载自带应用_Win11彻底卸载
- Win11笔记本怎么看电池健康度_Win11电池报
- Go 中实现 Python urllib.quot
- 如何在 Go 中正确初始化结构体中的 map 字段
- Python模块的__name__属性如何由导入方
- c++中如何对数组进行排序_c++数组排序算法汇总
- Windows10电脑怎么设置虚拟内存_Win10
- C#如何使用XPathNavigator高效查询X
- 如何在 Go 中正确反序列化 XML 多节点数组(
- Linux怎么查找死循环进程_Linux系统负载分
- Win11怎么忘记WiFi网络_Win11删除已保
- MAC怎么设置程序窗口永远最前_MAC窗口置顶插件
- Linux怎么修改用户密码_Linux系统pass
- 如何解决同一段404代码在不同主机上表现不一致的问
- Mac系统更新下载慢或失败怎么办_解决macOS升
- Python装饰器设计思路_功能增强机制说明【指导
- VSC怎样在VSC中调试PHPAPI_接口调试技巧
- C++中的constexpr和const有什么区别
- Linux如何安装Tomcat应用服务器_Linu
- Win10如何卸载预装Edge扩展_Win10卸载
- Win11怎么设置开机自动连接宽带_Windows
- windows如何测试网速_windows系统网络
- Win11系统占用空间大怎么办 Win11深度瘦身
- c++ reinterpret_cast怎么用 c
- 如何更改Windows资源管理器的默认启动位置?(
- Win11怎么查看wifi信号强度_检测Windo
- Win11怎么设置DNS服务器_Windows11
- c++中explicit(bool)的用法 c++
- Win11输入法切换快捷键怎么改_Windows
- php中::能访问全局变量吗_全局作用域与类作用域
- 如何使用Golang管理模块版本_Golanggo
- Windows10系统更新错误0x80070002
- Win10怎样安装Word样式库_Win10安装W
- Win11如何设置开机自动联网 Win11宽带连接
- php订单日志怎么记录发货_php记录订单发货操作
- Windows驱动无法加载错误解决方法_驱动签名验
- Python对象比较与排序_集合使用说明【指导】
- 如何在Golang中处理JSON字段缺失_Gola
- 如何使用Golang实现RPC序列化与反序列化_G
- Windows10系统怎么查看防火墙状态_Win1
- c++怎么操作redis数据库_c++ hired
- Win10怎么更改用户名 Win10修改账户名称操
- Win11任务栏怎么固定应用 Win11将软件图标
- Windows如何设置登录时的欢迎屏幕背景?(锁屏
- Win11如何设置开机问候语 Win11修改登录界
- 如何优化Golang内存分配与GC调度_Golan

QQ客服