Как проверить, существует ли modeladmin для данной модели?
modeladmins создаются путем регистрации модели с объектом admin.site. как можно проверить объект сайта, чтобы узнать, какие модели были зарегистрированы, и с каким admin_class?
Как проверить, существует ли modeladmin для данной модели?
modeladmins создаются путем регистрации модели с объектом admin.site. как можно проверить объект сайта, чтобы узнать, какие модели были зарегистрированы, и с каким admin_class?
Интересный вопрос, который заставил меня немного поработать.
Как только админ-классы были зарегистрированы, они сохраняются в атрибуте объекта 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>
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