Django: проверить для modeladmin для данной модели

Как проверить, существует ли modeladmin для данной модели?

modeladmins создаются путем регистрации модели с объектом admin.site. как можно проверить объект сайта, чтобы узнать, какие модели были зарегистрированы, и с каким admin_class?

Ответ 1

Интересный вопрос, который заставил меня немного поработать.

Как только админ-классы были зарегистрированы, они сохраняются в атрибуте объекта 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)

после того как он был фактически импортирован - обычно с помощью строки admin.autodiscover() в urls.py - admin.site._registry будет содержаться что-то вроде этого:

{<class 'myapp.models.MyModel'>: 
    <django.contrib.admin.options.ModelAdmin object at 0x10210ba50>}

и вы получите объект ModelAdmin для MyModel с помощью самой модели в качестве ключа:

>>> admin.site._registry[MyModel]
<django.contrib.admin.options.ModelAdmin object at 0x10210ba50>

Ответ 2

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