实施自己的最佳方法是哪一种django.contrib.admin.sites.AdminSite?
django.contrib.admin.sites.AdminSite
其实我得到一个问题登记INSTALLED_APPS在django.contrib.admin.autodiscover。如果我在中使用自定义AdminSite类urls.py,则管理页面上不会显示任何应用程序。
INSTALLED_APPS在django.contrib.admin.autodiscover
AdminSite
urls.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()
所以,我可以用这个site为urls.py。
site
有人知道更好的方法吗?由于我以下划线开头访问var,所以它不过是hack。我不喜欢黑客。
编辑:另一种方法是重写django.contrib.admin.autodiscover函数,但是在这种情况下,我将有冗余代码。
django.contrib.admin.autodiscover
但是,如果你想使用自定义行为来设置自己的管理站点,则可以随意继承AdminSite的子类并覆盖或添加所需的任何内容。然后,只需创建AdminSite子类的实例(实例化任何其他Python类的方式),然后向其注册模型和ModelAdmin子类,而不使用default。
我想这是最明确的方法,但这也意味着你需要在应用程序admin.py文件中更改注册代码。
使用自己的AdminSite实例时,实际上不需要使用自动发现,因为你可能会导入myproject.admin模块中的所有每个应用程序admin.py模块。
假设似乎是,一旦你开始编写自定义管理网站,它就变成了特定于项目的项目,并且你事先知道要包含哪些应用程序。
因此,如果你不想使用上面的技巧,我只会看到这两个选项。替换对你的自定义管理站点的所有注册调用,或在你的管理站点模块中显式注册模型。