问题 django:检查给定模型的modeladmin


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

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


3228
2018-06-02 07:16


起源



答案:


有趣的问题,这让我做了一点挖掘。

一旦注册了管理类,它们就存储在一个属性中 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>

14
2018-06-02 08:03



嗯...这也是我的第一次尝试,但_registry中没有任何内容..可能是因为我从manage.py shell检查过,并且没有调用自动发现。这可能是它! - Cody Django
谢谢!完美的工作 Django 1.4,但是不存在从模型中直接访问ModelAdmin的方法吗?它会比我的方法更漂亮: admin.site._registry[obj.__class__] :) - caesarsol
@caesarsol因为MVC,你的模型应该对admin一无所知 - Django不是真正的MVC,而是接近它 - Karolis Ryselis
@KarolisRyselis你是完全正确的,我甚至不记得我会用它来做什么......我对2013年的SOLID原则一无所知:) - caesarsol


答案:


有趣的问题,这让我做了一点挖掘。

一旦注册了管理类,它们就存储在一个属性中 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>

14
2018-06-02 08:03



嗯...这也是我的第一次尝试,但_registry中没有任何内容..可能是因为我从manage.py shell检查过,并且没有调用自动发现。这可能是它! - Cody Django
谢谢!完美的工作 Django 1.4,但是不存在从模型中直接访问ModelAdmin的方法吗?它会比我的方法更漂亮: admin.site._registry[obj.__class__] :) - caesarsol
@caesarsol因为MVC,你的模型应该对admin一无所知 - Django不是真正的MVC,而是接近它 - Karolis Ryselis
@KarolisRyselis你是完全正确的,我甚至不记得我会用它来做什么......我对2013年的SOLID原则一无所知:) - caesarsol