如何检查给定模型的modeladmin是否存在?
通过使用admin.site对象注册模型来创建modeladmins。如何检查站点对象以查看已注册的模型以及使用哪个admin_class?
答案 0 :(得分:15)
有趣的问题,这让我做了一点挖掘。
一旦注册了管理类,它们就会存储在site
对象的一个属性中,这个属性被称为 - _registry
。这是一个模型类到modeladmin类的字典 - 注意键和值都是类,而不是名称。
所以如果你有这样的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>
答案 1 :(得分:0)
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
进行了检查