一尘不染

如何使用自定义AdminSite类?

django

实施自己的最佳方法是哪一种django.contrib.admin.sites.AdminSite

其实我得到一个问题登记INSTALLED_APPS在django.contrib.admin.autodiscover。如果我在中使用自定义AdminSiteurls.py,则管理页面上不会显示任何应用程序。

我用一个小技巧解决了这个问题。我写了这个课:

from django.contrib.admin.sites import site as default_site

class AdminSiteRegistryFix( object ):
    '''
    This fix links the '_registry' property to the orginal AdminSites
    '_registry' property. This is necessary, because of the character of
    the admins 'autodiscover' function. Otherwise the admin site will say,
    that you havn't permission to edit anything.
    '''

    def _registry_getter(self):
        return default_site._registry

    def _registry_setter(self,value):
        default_site._registry = value

    _registry = property(_registry_getter, _registry_setter)

并像这样实现我的自定义AdminSite:

from wltrweb.hacks.django.admin import AdminSiteRegistryFix
from django.contrib.admin import AdminSite

class MyAdminSite( AdminSite, AdminSiteRegistryFix ):
    # do some magic
    pass        


site = MyAdminSite()

所以,我可以用这个siteurls.py

有人知道更好的方法吗?由于我以下划线开头访问var,所以它不过是hack。我不喜欢黑客。

编辑:另一种方法是重写django.contrib.admin.autodiscover函数,但是在这种情况下,我将有冗余代码。


阅读 682

收藏
2020-03-31

共1个答案

一尘不染

但是,如果你想使用自定义行为来设置自己的管理站点,则可以随意继承AdminSite的子类并覆盖或添加所需的任何内容。然后,只需创建AdminSite子类的实例(实例化任何其他Python类的方式),然后向其注册模型和ModelAdmin子类,而不使用default。

我想这是最明确的方法,但这也意味着你需要在应用程序admin.py文件中更改注册代码。

使用自己的AdminSite实例时,实际上不需要使用自动发现,因为你可能会导入myproject.admin模块中的所有每个应用程序admin.py模块。

假设似乎是,一旦你开始编写自定义管理网站,它就变成了特定于项目的项目,并且你事先知道要包含哪些应用程序。

因此,如果你不想使用上面的技巧,我只会看到这两个选项。替换对你的自定义管理站点的所有注册调用,或在你的管理站点模块中显式注册模型。

2020-03-31