【问题标题】:django: check for modeladmin for a given modeldjango:检查给定模型的modeladmin
【发布时间】:2010-06-02 07:16:05
【问题描述】:

如何检查给定模型是否存在模型管理员?

modeladmins 是通过向 admin.site 对象注册模型来创建的。如何检查站点对象以查看哪些模型已注册,以及注册了哪个 admin_class?

【问题讨论】:

    标签: django django-admin


    【解决方案1】:

    有趣的问题,让我想去挖掘。

    一旦管理类被注册,它们就会被存储在site 对象的一个​​属性中——这并不奇怪——_registry。这是模型类到模型管理类的字典 - 请注意键和值都是 类,而不是名称。

    如果你有这样的 admin.py:

    from django.contrib import admin
    from myapp.models import MyModel
    
    class MyModelAdmin(admin.ModelAdmin):
        list_display = ('field1', 'field2')
    
    admin.site.register(MyModel, MyModelAdmin)
    

    然后一旦实际导入 - 通常是通过 urls.py 中的 admin.autodiscover() 行 - admin.site._registry 将包含以下内容:

    {<class 'myapp.models.MyModel'>: 
        <django.contrib.admin.options.ModelAdmin object at 0x10210ba50>}
    

    您将通过使用模型本身作为键来获取 MyModel 的 ModelAdmin 对象:

    >>> admin.site._registry[MyModel]
    <django.contrib.admin.options.ModelAdmin object at 0x10210ba50>
    

    【讨论】:

    • hmmm...这也是我的第一次尝试,但 _registry 中没有任何内容。可能是因为我从 manage.py shell 中检查过,并且没有调用自动发现。可能就是这个!
    • 谢谢!在 Django 1.4 中完美运行,但没有一种方法可以从模型中直接访问 ModelAdmin 吗?它会比我的方法更漂亮:admin.site._registry[obj.__class__] :)
    • @caesarsol 由于 MVC,您的模型应该对管理员一无所知 - Django 不是真正的 MVC,但接近它
    • @KarolisRyselis 你是绝对正确的,我什至不记得我会用它来做什么......我对 2013 年的 SOLID 原则一无所知 :)
    【解决方案2】:

    Django 的django.contrib.admin.sites.AdminSite 有一个检查已注册模型的方法,称为.is_registered(model)。此方法将检查管理站点的_registry 属性(就像Daniel Roseman 的方法)

    所以,如果你有这样的文件:

    # models.py
    
    from django.db import models
    
    class MyModel(models.Model)
        field1 = ...
        field2 = ...
    
    # admin.py
    
    from django.contrib import admin
    from .models import MyModel
    
    class MyModelAdmin(admin.ModelAdmin):
        list_display = ('field1', 'field2')
    
    admin.site.register(MyModel, MyModelAdmin)
    

    你可以做一些这样的测试:

    # tests.py
    
    from django.test import TestCase
    from .models import MyModel
    
    class TestModelAdmin(TestCase):
    
        def test_mymodel_registered(self):
            self.assertTrue(admin.site.is_registered(MyModel))
    

    nb:我在 Django 的模块文档中检查了它,从 Django 1.8 到 Django 2.2

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-01-28
      • 2010-10-31
      • 2020-06-28
      • 2020-05-11
      • 1970-01-01
      • 2011-02-12
      • 2011-11-08
      • 1970-01-01
      相关资源
      最近更新 更多