当前位置: 首页 > 面试题库 >

如何使用自定义AdminSite类?

扈运浩
2023-03-14
问题内容

实施自己的最佳方法是哪一种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函数,但是在这种情况下,我将有冗余代码。


问题答案:

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

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

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

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

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



 类似资料:
  • 问题内容: 我正在尝试在Go中创建和使用自定义包。这可能很明显,但是我找不到很多信息。基本上,我在同一个文件夹中拥有这两个文件: mylib.go main.go 当我尝试时,出现此错误: 我尝试先运行,但似乎没有做任何事(没有生成文件,没有错误消息)。所以有什么想法我该怎么做? 问题答案: 首先,请务必阅读并理解“如何编写Go代码”文档。 实际答案取决于您“定制包装”的性质。 如果打算用于一般用

  • 我正在尝试在Go中创建和使用自定义包。这可能是非常明显的事情,但我找不到有关此的太多信息。基本上,我在同一个文件夹中有这两个文件: mylib。去 主要的去 当我尝试时,我得到这个错误: 我试着运行,但它似乎什么都没做(没有生成文件,没有错误消息)。你知道我该怎么做吗?

  • 根据Javers的文件:(参考:https://javers.org/documentation/repository-configuration/) JaVers在SQL数据库中创建四个表: jv_global_id域对象标识符, jv_commitJaVers提交元数据, jv_commit_property提交属性, jv_snapshot域对象快照。 我当前使用的Spring Boot J

  • 问题内容: 我想将非spring bean类对象用作球衣Web服务类方法的参数。但是它在构建时会给出缺少的依赖项错误。 我的代码是: 问题答案: 关键是路径参数以字符串形式出现。根据规范,如果我们希望将自定义类型作为注入,则自定义类应具有以下三项之一: 返回类型的公共静态 返回类型的公共静态 或接受字符串的公共构造函数 另一种选择实现。您可以在此处查看示例。 如果您不拥有该类(它是无法更改的第三方

  • 问题内容: 我有一个C#/ Selenium / Specflow测试套件,正在使用xunit.console.exe使用Jenkins运行。我需要将这些测试指向不同的环境(Test / QA / Prod等),并想使用命令行参数。 我正在调用的批处理命令是: 并希望包含一个额外的参数,例如: “ -env = PROD”, 以将该作业指向特定的环境。 我愿意采取更好的方法。 问题答案: 对于此解

  • 我想对自定义JFX组件进行子类化,以更改/扩展它们的行为。作为一个真实的例子,我想扩展一个具有编辑功能的data viewer组件。 考虑下面非常小的场景。使用类非常有效。但是当实例化子类(在FXML文件中)时,不再注入字段 会自动调用该方法。 我知道将超级组件嵌套在子组件中应该可以很好地工作,但是我仍然想知道使用继承是否可以做到这一点。 将的可见性扩大到显然无法解决此问题。在中结合定义扩展点(此