如何反转Django Admin中特定模型动作对应的URL?
如何查找Django Admin动作的相关URL(含自定义动作)
我之前也碰到过这个头疼的问题——翻了好半天Stack Overflow和Django官方文档都没找到明确答案,折腾了一阵才摸清楚门路,特意整理出来帮大家避坑:
一、默认Admin动作的URL反向解析
你已经提到了,默认的Admin动作(比如change、delete、add这类)确实可以通过reverse(admin:appname_modelname_*)来反向生成URL,举几个常用的例子:
- 模型列表页:
reverse('admin:myapp_mymodel_changelist') - 新增对象页:
reverse('admin:myapp_mymodel_add') - 编辑指定对象(需传入对象ID):
reverse('admin:myapp_mymodel_change', args=[obj.id]) - 删除指定对象(需传入对象ID):
reverse('admin:myapp_mymodel_delete', args=[obj.id])
二、自定义Admin动作的URL获取方法
自定义动作的URL规则没在官方文档里明说,但其实有几个简单的方法能拿到:
1. 打印Admin站点的所有URL模式
Django会自动为每个注册的Admin模型生成对应的URL配置,你可以在项目里跑一段小代码,把所有Admin的URL名称都打印出来:
from django.contrib import admin from django.urls import get_resolver # 获取Admin站点的路由解析器 admin_urls = get_resolver(admin.site.urls) # 遍历打印所有URL名称 for pattern in admin_urls.url_patterns: print(pattern.name)
运行之后,你就能看到所有已注册模型的动作URL名称,包括你自己定义的自定义动作(只要已经在ModelAdmin里注册过)。
2. 按规则手动构造URL名称
自定义动作的URL名称是有固定格式的:admin:appname_modelname_action函数名。
举个实际例子:假设你在myapp的MyModelAdmin里定义了一个叫mark_as_approved的自定义动作,那它的反向解析就是:
reverse('admin:myapp_mymodel_mark_as_approved')
注意哦,这个URL是批量动作的提交地址,一般需要配合POST请求,还要带上选中对象的ID参数。
3. 从页面源码里找
如果怕构造错,最简单的方法是打开Django调试模式,进入对应模型的Admin列表页,然后查看页面源码里的批量操作表单的action属性——里面就是自定义动作的完整URL,你可以直接提取出名称来做反向解析。
内容的提问来源于stack exchange,提问作者Sam Bobel
相关产品推荐
相关产品推荐

