【发布时间】:2010-06-02 07:16:05
【问题描述】:
如何检查给定模型是否存在模型管理员?
modeladmins 是通过向 admin.site 对象注册模型来创建的。如何检查站点对象以查看哪些模型已注册,以及注册了哪个 admin_class?
【问题讨论】:
标签: django django-admin
如何检查给定模型是否存在模型管理员?
modeladmins 是通过向 admin.site 对象注册模型来创建的。如何检查站点对象以查看哪些模型已注册,以及注册了哪个 admin_class?
【问题讨论】:
标签: django django-admin
有趣的问题,让我想去挖掘。
一旦管理类被注册,它们就会被存储在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>
【讨论】:
admin.site._registry[obj.__class__] :)
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
【讨论】: