首页 > 解决方案 > 在 django admin 中自动注册某些模型的问题

问题描述

我有一个看起来像这样的基本模型:

...
from core.admin import TimeStampedNamedAndDescriptionAdmin

class EditableNameAndDescriptionModel(NameAndDescriptionModel, TimeStampedModel):

    def __str__(self):
        return self.name

    class Meta(NameAndDescriptionModel.Meta):
        abstract = True
        admin_class = TimeStampedNamedAndDescriptionAdmin

以及扩展此模型的模型:

class Kebab(EditableNameAndDescriptionModel):

    class Meta(EditableNameAndDescriptionModel.Meta):
        verbose_name = _("Kebab")
        verbose_name_plural = _("Kebabs")

我正在尝试自动注册Meta.admin_class使用此定义的所有模型urls.py(因为此处加载了应用程序注册表)

from core.admin import auto_register_models
...
auto_register_models()

管理员.py

def auto_register(model):
    if hasattr(model._meta, "admin_class"):
        field_list = [f.name for f in model._meta.get_fields() if f.auto_created == False]
        model_admin = type("AutoRegisteredAdmin", (model._meta.admin_class,), {'list_display': field_list})
        try:
            admin.site.register(model, model_admin)
        except AlreadyRegistered:
            pass


def auto_register_models():
    for model in apps.get_app_config('core').get_models():
        auto_register(model)

基于此: https ://technowhisp.com/auto-registering-models-in-django-admin/

模型已注册,但这就是它在Django管理员中的样子。我是否使用model._meta.admin_classModelAdmin在上面的代码中都没有关系。结果是一样的。

没有链接的模型

只是没有任何模型链接的黑色文本。模型的 URL(/core/kebab/)只是给了我一个404.

如果我在admin.py模型中运行它,则按预期注册:

def auto_register(model):
    field_list = [f.name for f in model._meta.get_fields() if f.auto_created == False]
    model_admin = type("AutoRegisteredAdmin", (ModelAdmin,), {'list_display': field_list})
    try:
        admin.site.register(model, model_admin)
    except AlreadyRegistered:
        pass

for model in apps.get_app_config('core').get_models():
    auto_register(model)

但是,如果我在我的 EditableNameAndDescriptionModel 中导入:

from core.admin import TimeStampedNamedAndDescriptionAdmin

我得到:

django.core.exceptions.AppRegistryNotReady: Models aren't loaded yet.

感觉就像这里的某种 Catch 22。关于如何解决这个问题的任何想法?

标签: djangodjango-modelsdjango-admin

解决方案


发生这种情况是因为您尝试导入尚未加载到内存中的内容,

有点难看,但它会工作

class EditableNameAndDescriptionModel(NameAndDescriptionModel, TimeStampedModel):

    def __str__(self):
        return self.name

    class Meta(NameAndDescriptionModel.Meta):
        from core.admin import TimeStampedNamedAndDescriptionAdmin # import it here 
        abstract = True
        admin_class = TimeStampedNamedAndDescriptionAdmin

推荐阅读