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