Django:检查给定模型的modeladmin

19

如何检查给定模型是否存在modeladmin?

通过将模型注册到admin.site对象中来创建modeladmins。如何检查网站对象以查看哪些模型已被注册,以及使用了哪个admin_class?

2个回答

22

有趣的问题,它促使我进行了一些调查。

一旦管理类别被注册,它们将存储在名为_registrysite对象属性中。这是一个模型类到模型管理类的字典 - 注意,键和值都是,而不是名称。

因此,如果您有像这样的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>

嗯...这也是我的第一次尝试,但_registry里面什么都没有..可能是因为我从manage.py shell中检查,而autodiscover还没有被调用。这可能就是原因! - Cody Django
谢谢!在Django 1.4中完美运行,但是有没有一种方法可以直接从模型中访问ModelAdmin?这比我的方法更漂亮:admin.site._registry[obj.__class__] :) - caesarsol
@caesarsol,你的模型不应该知道关于管理员的任何信息,因为MVC原则 - Django并不是真正的MVC,但接近它。 - Karolis Ryselis
@KarolisRyselis,你说得完全正确,我甚至不记得我当时会用它来做什么了... 2013年的时候我对SOLID原则一无所知 :) - caesarsol

3
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))

注意:我已经在 Django 的模块文档中进行了检查,从 Django 1.8Django 2.2


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接