2011-11-02 97 views
4

如何查找任意模型的管理员更改网址?查找管理员更改任意Django模型的网址

如果我知道的模型,我可以做这样的事情弄的网址:

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

我有一个模型,一个通用外键,我想提供在管理员的一个链接对象的相应更改页面。由于它可以是任何类型的模型,我不能轻易使用reverse()。有什么办法可以简单地将这一点告诉以下人员?

>>> get_admin_change_url(obj) 
/admin/myapp/mymodel/123/ 

回答

5

一旦有了对象,你可以访问其应用标签和名称在其_meta类,然后构建管理变更网址的名称动态。

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

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

请注意,这里假定您的admin.py与您的models.py匹配,这通常会。如果您使用代理模型,或者在不同的app_label下显示模型的modeladmin,这将不起作用。 – Cerin

+0

如果您将代理模型用作ModelAdmin的*模型,它将会正常工作。我不确定你为什么不会那么做,因为在那时你不会真正在做正确的事情。 –