实现我自己的django.contrib.admin.sites.AdminSite的最佳方式是什么?

实际上,我在django.contrib.admin.autodiscover号房登记INSTALLED_APPS号的时候遇到了一个问题.如果我在urls.py中使用我的自定义AdminSite类,则管理页面上没有显示任何应用程序.

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

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元.

有人知道更好的方法吗?因为我访问的是一个以下划线开头的var,所以它只不过是一个黑客行为.我不喜欢黑客.

Edit:另一种方法是重写django.contrib.admin.autodiscover函数,但在这种情况下,我会有多余的代码.

推荐答案

引用https://docs.djangoproject.com/en/1.10/ref/contrib/admin/#customizing-the-adminsite-class

但是,如果您想使用自定义行为设置您自己的管理站点,您可以自由地子类化AdminSite并覆盖或添加您喜欢的任何内容.然后,只需创建AdminSite子类的一个实例(与实例化任何其他Python类的方式相同)和register your models and ModelAdmin subclasses with it instead of using the default.

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

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

我们的假设似乎是,一旦你开始编写你的自定义管理网站,它就变得非常特定于项目,并且你事先知道你想要包含哪些apply.

所以,如果你不想使用上面的黑客,我真的只看到了这两个选项.替换对自定义管理站点的所有注册调用,或在管理站点模块中显式注册模型.

Django相关问答推荐

使用override_sets构建一个预装饰的类,以更快的客户端.登录?

Django和静态文件

django优化查询

Django中的DateTimeField到DateField

`.objects` 属性在哪里添加到 Django 的 models.Model 类中的实例命名空间?

Django 注释(),计数()

如何将 select_related 应用于 Django 中的 m2m 关系的对象?

在 Django Admin change_list 视图中更改 list_editable 字段时保存 Django 模型

Django:如何在表单 clean() 方法的 django 验证错误中添加 超链接?

如何将表单中的用户字段设置为当前登录的用户?

在 Scrapy 中访问 django 模型

Django判断字段是否为空?

在 Django 的 ORM 中访问存储过程的最佳方法是什么

在 Django 中,您可以向查询集添加方法吗?

如何在终端中切换 Python 版本?

重命名 django 元素的简单方法

Django REST Framework - 序列化可选字段

Django Rest Framework 序列化程序中的循环依赖

Django admin:使字段在添加中可编辑但不可编辑

何时使用 Django get_absolute_url() 方法?