django admin super(type,obj)

时间:2013-05-14 16:28:47

标签: django admin super

好吧,让我解释一下。

我正在开发一个简单的django管理项目。

在admin.py文件中,我有以下管理类:

class A_Admin(admin.ModelAdmin):
    #some stuff


class B_Admin(admin.ModelAdmin):
    #some stuff

我想覆盖A_Admin的get_urls()方法,如果我单击A_Admin实例更改页面上的按钮,它会将页面重定向到B_Admin更改列表页面。

(我知道有很多方法可以做我想做的事情,上面提到的并不是最好的,但这就是我想要的。所以,请跳过讨论,为什么我坚持这个解决方案。)

我想要以下内容:

def get_urls(self):
    #django's code
    #inside the urlpattern
    urlpattern = (
        #default urls from django admin
        .....
        url(r'^some_url$',
            wrap(super(B_Admin, self).changelist_view),
            name='%s_%s_delete' % info),
        ....)

    return urlpatterns

这不起作用,因为'self'是A_Admin类对象而不是B_Admin obejct。

那么有没有办法在B_Admin中获得calss A_Admin的代理? 我只想覆盖A的changelist_view并在B中调用它。

这可能吗?

提前致谢

1 个答案:

答案 0 :(得分:0)

您应该只是实例化B_Admin并使用其方法。

我相信以下代码应该有效:

from django.contrib import admin
from my_app.models import B_Model  # The model for which B_Admin is used

def get_urls(self):
    #django's code
    #inside the urlpattern
    urlpattern = (
        #default urls from django admin
        .....
        url(r'^some_url$',
            wrap(B_Admin(B_Model, admin.site).changelist_view),
            name='%s_%s_delete' % info),
        ....)

return urlpatterns

更新:最有可能的是,当您调用

时,B_Admin已经被实例化了
admin.site.register(B_Model, B_Admin)

所以不要做

B_Admin(B_Model, admin.site)

再次,您可以从AdminSite的注册表中获取它:

admin.site._registry[B_Model]