在子目录中定义Django管理模型而不是admin.py

2024-09-25 00:36:27 发布

您现在位置:Python中文网/ 问答频道 /正文

我的目标是在单独的文件中定义管理模型。因此,项目结构如下所示:

应用程序

admin_models
       __init__.py
       TestAdmin.py

TestAdmin.py:

from django.contrib import admin
from cms.models import (
    TestModel)


class TestAdmin(admin.ModelAdmin):
    fields = (...)


admin.site.register(TestModel, TestAdmin)

问题是模型没有出现在管理页面上。然而,在标准结构中(如果我将TestAdmin.py文件的内容移动到应用程序内部顶层的admin.py),那么一切都可以正常工作。怎么解决这个问题


Tags: 文件项目frompy模型import应用程序目标
1条回答
网友
1楼 · 发布于 2024-09-25 00:36:27

Django的内部(例如"autodiscovery")依赖于某个应用程序结构。部分原因是在应用程序加载时导入已安装应用程序中的admin命名空间(在^{}方法中)。因此,您可以创建一个包结构,如:

app
    admin
        __init__.py
        test_admin.py  # different from admin class name!
        another_admin.py

test_admin.py中,您可以像以前一样定义TestAdmin类。在包的__init__.py中,从子模块导入管理员:

# __init__.py
from .test_admin import TestAdmin
from .other_admin import YetAnotherAdmin

这样,您就可以构建代码库,django的内部工作仍然会注册模型管理员,因为他们在它寻找他们的地方

正如@Alasdair所指出的,您还可以在自定义AppConfig中“手动”导入自定义管理模块。如果您还没有,我将坚持使用上述方法,因为它不需要在可能产生不可预见的副作用的不同位置(INSTALLED_APPSapp/__init__.pyapp/apps.py,…)进行更改

相关问题 更多 >