如何检查给定模型是否存在modeladmin?
通过将模型注册到admin.site对象中来创建modeladmins。如何检查网站对象以查看哪些模型已被注册,以及使用了哪个admin_class?
如何检查给定模型是否存在modeladmin?
通过将模型注册到admin.site对象中来创建modeladmins。如何检查网站对象以查看哪些模型已被注册,以及使用了哪个admin_class?
有趣的问题,它促使我进行了一些调查。
一旦管理类别被注册,它们将存储在名为_registry
的site
对象属性中。这是一个模型类到模型管理类的字典 - 注意,键和值都是类,而不是名称。
因此,如果您有像这样的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>
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.8 到 Django 2.2。
admin.site._registry[obj.__class__]
:) - caesarsol