寻找任意Django模型的管理更改URL

4

如何查找任意模型的管理员更改URL?

如果我知道模型,我可以通过执行以下操作来获取URL:

>>> print urlresolvers.reverse('admin:myapp_mymodel_change', args=(obj.id,))
/admin/myapp/mymodel/123/

我在一个模型上有一个通用的外键,我想在管理页面中提供一个链接到对象对应的更改页面。由于它可以是任何类型的模型,我不能轻易地使用reverse()。有没有什么方法可以简化为以下内容?

>>> get_admin_change_url(obj)
/admin/myapp/mymodel/123/
1个回答

5

一旦你有了这个对象,你就可以在它的_meta类上访问它的应用标签和名称,然后动态构建管理员更改URL的名称。

app_label = obj._meta.app_label
model = obj._meta.module_name

reverse('admin:%s_%s_change' % (app_label, model), args=(obj.id,))

2
请注意,这假设你的 admin.py 与 models.py 匹配,通常情况下是匹配的。如果你正在使用代理模型或者在不同的 app_label 下展示模型的 modeladmin,则这将无法工作。 - Cerin
如果您将代理模型用作“ModelAdmin”的模型,它将正常工作。我不确定为什么您不这样做,因为此时您实际上不会使用正确的内容。 - Chris Pratt
您好。我有一个使用案例,根据上下文/用户呈现不同的管理员视图。其中一个基于原始模型,另一个基于该模型的代理。 - caram
实际上,reverse() 函数适用于代理模型。如果您的代理恰好位于不同的站点上,则必须使用该站点前缀,例如 reverse('mysite:myapp_myproxy_changelist'),其中 mysiteadmin 不同。 - caram

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接