【问题标题】:Django ImportError: Module does not define attribute/classDjango ImportError:模块未定义属性/类
【发布时间】:2021-07-04 13:17:22
【问题描述】:

我正在尝试添加一个自定义/覆盖的 AdminSite,因为我需要一个不同的 Admin 模板。我按照文档所说的做了一切: https://docs.djangoproject.com/en/3.0/ref/contrib/admin/#overriding-the-default-admin-site

项目/admin.py

from django.contrib.admin import AdminSite 

class NewAdminSite(AdminSite):
    index_template = 'admin/index.html'
    site_header = 'Administration'

admin_site = NewAdminSite(name='newadmin')

项目/apps.py

class NewAdminConfig(AdminConfig):
    default_site = 'project.admin.NewAdminSite'

我没有任何其他应用程序,项目是我的根目录 我在 urls.py 中添加了 admin_site.urls 而不是 admin.site.urls,在 apps.py 中创建了一个自定义 AdminConfig,并将新的 AdminConfig 添加到已安装的应用程序而不是 django.contrib.admin。

问题是我现在收到了这个:

AdminSiteClass = import_string(apps.get_app_config('admin').default_site)

文件“C:\Users\User.virtualenvs\ssccms-fGQRLLK4\lib\site-packages\django\utils\module_loading.py”,第 24 行,在 import_string ) 从错误

ImportError:模块“project.admin”未定义“NewAdminSite”属性/类

我的文件夹结构:

manage.py

项目

  • 管理员
  • 设置
  • 网址
  • 应用程序
  • 静态
  • 模板
  • 迁移

工作目录

  • sqlite
  • 媒体

节点模块

语言环境

pipfile.lock

点文件

wsgi

希望这对于文件夹结构来说已经足够了,它是 django-shop cookiecutter 项目示例结构

编辑:

是的,这绝对是循环导入错误。我现在的解决方法是通过编写简单地使用给定的 admin.site:

admin.site.index_template = 'admin/newadminindextemplate.html'

有效!这实际上就是我想要的。但是文档说以下 https://docs.djangoproject.com/en/3.0/ref/contrib/admin/#root-and-login-templates

如果您希望更改索引、登录或注销模板,最好创建自己的 AdminSite 实例。

我试过了:

https://docs.djangoproject.com/en/3.0/ref/contrib/admin/#customizing-the-adminsite-class

而不是我在问题的第一个链接中粘贴的覆盖部分,但现在有

django.urls.exceptions.NoReverseMatch:找不到“cascade_texteditor_config”的反向。 'cascade_texteditor_config' 不是有效的视图函数或模式名称。

现在我的新问题是:

是否有必要创建自己的索引模板实例?文档说没有解释,所以我以后可能会通过执行 admin.site.index_template 遇到任何问题?

【问题讨论】:

  • 我更正了 django 文档链接。我不明白你评论的结尾 - 我只是想覆盖 django.contrib.admin.AdminSite 的 index_template 属性,我没有在其他任何地方编写/定义它,我认为 admin.py 中的代码就足够了吗?
  • 在最后一部分,我问的是你编写课程的文件名(你添加了这个project/admin.py)。无论如何,一切看起来都很好......你可以将你的目录结构添加到问题中吗?
  • 我希望这就是您对文件夹结构的意思,但我认为我们在这里有一个误解:我认为以这种方式对 AdminSite 进行子类化并添加/覆盖我的属性/功能就足够了想要更改/添加 admin.py。我没有在其他任何地方定义它,我对 AdminSite 现在的状态完全满意,所以我认为以这种方式对其进行编码就足够了,并且如果 NewAdminSite 以这种方式继承自 AdminSite ,则 django 可以使用 AdminSite 中定义的任何函数。跨度>
  • 我并不是说你需要做更多的事情。我要求目录结构以了解您从哪里得到错误。查看您的目录结构,一切看起来都很好。我只能说,也许还有其他一些project.admin 是从某个地方导入的,或者您的admin.py 中可能实际上有类似del NewAdminSite 的东西。
  • 好的,我会调查的,非常感谢!

标签: python django importerror django-shop


【解决方案1】:

我刚刚遇到了类似的错误。这有点令人困惑,在我的情况下,这是由于循环导入。

在我的情况下,以下帮助:

  • 将包含 NewAdminSite 类的文件顶部的导入转换为本地导入(在需要它们的函数内部
  • admin_site 变量的实例化移动到单独的文件中

这些问题在您粘贴的代码中实际上都看不到,但可能会让您知道要查找的内容。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-11-19
    • 2014-09-08
    • 2020-05-30
    • 1970-01-01
    • 2015-08-27
    • 1970-01-01
    • 2014-11-14
    相关资源
    最近更新 更多