django - 在 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_class
或ModelAdmin
在上面的代码中都没有关系。结果是一样的。
只是没有任何模型链接的黑色文本。模型的 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。关于如何解决这个问题的任何想法?
解决方案
发生这种情况是因为您尝试导入尚未加载到内存中的内容,
有点难看,但它会工作
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
推荐阅读
- installation - Inno Setup 安装程序多个页面上的组件
- sql - 如何在查询中汇总特定字符串
- java - 在我的应用程序中使用 OSGI 包时出现 java.lang.NoSuchMethodError 错误
- python - 如何在python中将安装路径与通配符应用程序名称进行比较
- xpath - 如何针对 html 文档评估 xpath 表达式?
- java - 新的 JSONObject 触发 java.lang.NoClassDefFoundError
- c - 如何在 Swift 中复制指向数组的指针?
- c# - OnCollisionEnter 未检测到
- javascript - Azure Functions JS:函数内部的 http(s) POST 请求调用不起作用
- r - 在时间序列中查找不同的范围