django:检查给定模型的modeladmin

时间:2010-06-02 07:16:06

标签: django django-admin

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

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

2 个答案:

答案 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.8Django 2.2

进行了检查