【问题标题】:In Django 3.2 I am getting this error: app ImportError: Module 'apps.articles' does not contain a 'ArticlesConfig' class在 Django 3.2 中,我收到此错误:app ImportError: Module 'apps.articles' does not contain a 'ArticlesConfig' class
【发布时间】:2021-09-19 05:17:34
【问题描述】:

研究序言:我尝试了什么?

我是 Django 新手,在尝试遵循最佳实践的同时不断学习。我正在研究两勺 Django 3.x。任何关于结构的问题都应直接向作者提出。

我希望这个问题足够扎实,不会在最初的几分钟内被删除,因为我真的被这个问题困住了。如果要删除此问题,我将不胜感激有关如何改进我将来提出问题的方式的指导。我已经阅读了如何提出好问题的博客,并希望我能遵循这个指导。如果我确实错过了什么,请做的不仅仅是提供博客链接。

  • 请注意,我已经研究过这个问题,我最接近的是 Django 1.7 的问答:Django 1.7 app config ImportError: No module named appname.apps:这个解决方案对我不起作用(尽管它确实给了我一个很好的尝试途径)。有趣的是,他们选择了与我 5 年前完全相同的应用程序结构。请注意,在 config 中提供项目名称并没有像 OP 那样为我解决这个问题。
其他没有得到所需解决方案的问题:
  • django error - ImportError: No module named apps - 我试过这个答案,但它对我不起作用
  • Django Mezzanine ImportError: No module named apps - 我确认我指向的是 PyCharm 中专门创建的虚拟环境。根据 Django 3.2 的两个勺子,我安装了一个单独的 envs 文件夹,并为此项目激活了一个专用的 lanesflow_env。 PyCharm 似乎已经完成了这项工作,因为 base.py (settings.py) 中的 MIDDLEWARE 已成功导入所有 django 中间件应用程序。
其他不直接相关的问题(至少就我有限的经验而言):

问题的相关信息

这是项目树:

articles/__init__.py的内容:
default_app_config = 'LanesFlow.apps.articles.apps.ArticlesConfig'
articles/apps.py的内容:
from django.apps import AppConfig

class ArticlesConfig(AppConfig):
    default_auto_field = 'django.db.models.BigAutoField'
    name = 'apps.articles'
class ArticlesConfig(AppConfig):

    default_auto_field = 'django.db.models.BigAutoField'
    name = 'LanesFlow.apps.articles'  # This was checked per the answer to the researched question
base.py (settings.py) 中安装的应用程序:
INSTALLED_APPS = [
    'apps.articles.ArticlesConfig',
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
]
错误回溯:
    Watching for file changes with StatReloader
Exception in thread django-main-thread:
Traceback (most recent call last):
  File "C:\Users\Carewen\AppData\Local\Programs\Python\Python39\lib\threading.py", line 954, in _bootstrap_inner
    self.run()
  File "C:\Users\Carewen\AppData\Local\Programs\Python\Python39\lib\threading.py", line 892, in run
    self._target(*self._args, **self._kwargs)
  File "C:\Users\Carewen\AppData\Local\Programs\Python\Python39\lib\site-packages\django\utils\autoreload.py", line 64, in wrapper
    fn(*args, **kwargs)
  File "C:\Users\Carewen\AppData\Local\Programs\Python\Python39\lib\site-packages\django\core\management\commands\runserver.py", line 110, in inner_run
    autoreload.raise_last_exception()
  File "C:\Users\Carewen\AppData\Local\Programs\Python\Python39\lib\site-packages\django\utils\autoreload.py", line 87, in raise_last_exception
    raise _exception[1]
  File "C:\Users\Carewen\AppData\Local\Programs\Python\Python39\lib\site-packages\django\core\management\__init__.py", line 375, in execute
    autoreload.check_errors(django.setup)()
  File "C:\Users\Carewen\AppData\Local\Programs\Python\Python39\lib\site-packages\django\utils\autoreload.py", line 64, in wrapper
    fn(*args, **kwargs)
  File "C:\Users\Carewen\AppData\Local\Programs\Python\Python39\lib\site-packages\django\__init__.py", line 24, in setup
    apps.populate(settings.INSTALLED_APPS)
  File "C:\Users\Carewen\AppData\Local\Programs\Python\Python39\lib\site-packages\django\apps\registry.py", line 91, in populate
    app_config = AppConfig.create(entry)
  File "C:\Users\Carewen\AppData\Local\Programs\Python\Python39\lib\site-packages\django\apps\config.py", line 221, in create
    raise ImportError(msg)
ImportError: Module 'apps.articles' does not contain a 'ArticlesConfig' class.

欢迎任何帮助。

编辑

我再次恢复到上一个​​工作版本。我发现哪里出错了。当我尝试将 'articles.app.ArticleConfig' 添加到 INSTALLED_APPS 时,出现问题。问题是,这让我更加困惑。我正在尝试添加模板。我正在遵循的过程是:

  • 在根目录中创建模板目录,以文章作为子目录(遵循两个独家新闻中推荐的结构 - 这背后的逻辑是允许创建可用于所有应用程序的基本模板 - 这就是我想用这种方法来完成)。
  • 此时我得到了ImportError。但是,apps.py 文件确实联系了ArticlesConfig(AppConfig)

也在base.py (settings.py):

TEMPLATES = [
{
    'BACKEND': 'django.template.backends.django.DjangoTemplates',
    'DIRS': [BASE_DIR / 'apps.templates'],  # Two scoops add. Was []
    'APP_DIRS': True,
    'OPTIONS': {
        'context_processors': [
            'django.template.context_processors.debug',
            'django.template.context_processors.request',
            'django.contrib.auth.context_processors.auth',
            'django.contrib.messages.context_processors.messages',
        ],
    },
},
]

我仍然很困惑。我对 Django 的缺乏经验在这里真正体现出来了。我不确定我在添加INSTALLED_APPS 时做错了什么。我的直觉是让我去探索 settings.py 的其他方面,看看我是否指错了人。

【问题讨论】:

  • 您的项目结构看起来很奇怪。你有你的项目LanesFlow 然后在其中你有一个名为apps 的子目录,其中有一个名为articles 的应用程序?为什么要重新安排 Django 项目结构?
  • 根据帖子(字面意思是第一句话),我正在遵循书中建议的方法,Django 3.1 的两个独家新闻:feldroy.com/products/two-scoops-of-django-3-x 请直接向作者提出有关项目结构的问题。跨度>
  • 我正在根据进一步的故障排除编辑原始问题。
  • 我有一个这样的项目,这是一种很好的方式。这也是一个很好的问题,所以否决票是严厉的。你的问题真的是如何形成你的应用配置和定义你安装的应用吗?

标签: python django


【解决方案1】:

我正在处理一个与您正在构建的项目结构非常相似的项目。

它与默认的 django 设置或许多人使用的结构不同,但在这样做了 10 年后,我现在更喜欢这种设置。

我有一个名为 accounts 的应用程序,它的配置是这样设置的;

apps.accounts.__init__.py

default_app_config = 'apps.accounts.apps.AccountsConfig'

apps.accounts.apps.py

from django.apps import AppConfig
from django.utils.translation import ugettext_lazy as _


class AccountsConfig(AppConfig):
    """
    Accounts app, integrating with django-allauth
    """
    label = 'accounts'
    name = 'apps.accounts'
    verbose_name = _('Accounts')

    def ready(self):
        """
        App ready, hook up the signals
        """
        from . import signals    # NOQA

然后在设置中,我们使用引入 AppConfig 类之前的旧样式;

INSTALLED_APPS = [
    'apps.accounts',
]

设置文件的设置路径往往归结为 2 个有用的路径;

PROJECT_DIR = os.path.dirname(os.path.abspath(__file__))
BASE_DIR = os.path.abspath(os.path.join(PROJECT_DIR, '../'))

这是你的设置所在模块的路径(PROJECT_DIR),上面的目录往往是项目的根目录(BASE_DIR

然后您可以在模板设置等方面使用这些;

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [
            os.path.join(BASE_DIR, 'templates'),
            os.path.join(PROJECT_DIR, 'templates'),
        ],

编辑(来自 OP)

这并不能保证自己的答案,所以我将请求宽恕,而不是请求允许编辑/添加到上面的答案)

上面的方法非常有帮助,给了我冲线的动力。我最终得到了一个有趣的结果,仍然值得我进行研究/调查/学习,但它的进步在于我所追求的项目结构(大部分)符合预期。我将与两个独家新闻的作者跟进一个问题,以强调其中发生的事情,以及他们是否可以更深入地阐明如何偏离项目结构。

在对 apps.articles.apps.py 进行编辑后运行时,出现以下错误:

ImportError: cannot import name 'signals' from 'apps.articles' (C:\Users\Carewen\Python\projects\LanesFlow\apps\articles\__init__.py).  

我注释掉了 def ready(self) 函数,假设我还不需要连接信号。

这是一个进步,因为我现在可以运行服务器了。实际上,这使我能够维护现有的 INSTALLED_APPS 声明,如您所述。现在来了有趣的部分。如果我将模板文件夹移动到配置目录中,我可以让它工作。这不是我想要的。因为这现在意味着我有 config/templates/articles 作为 html 文件的来源。但是,这肯定是一种改进,因为它正在工作......

我怀疑这归结为在我的项目设置中如何在 base.py (settings.py) 中设置 DIRS。起初查看回溯时,我可以看到对模板/模板的调用,这向我展示了 Two Scoops 中的建议不太正确。最后,我对“DIRS”进行了调整:

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [BASE_DIR / ''],  # Two scoops add. Was [] -- [BASE_DIR / 'templates']
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
            ],
        },
    },
]

对于未来的读者,我在评论中要澄清的是,我从两个独家新闻中推荐的方法开始,然后转向 BASE_DIR / ''。虽然我得到了这个工作,但这就是我对 Python 缺乏经验的地方,因为我不完全理解它是如何工作的。

按顺序,这里是提供答案的剩余代码 sn-ps,在上述基础上进行了额外的调整。

文章\urls.py:
from django.urls import path

from . import views

urlpatterns = [
    path('', views.home, name='articles-home'),
    path('about/', views.about, name='articles-about'),
]
文章/apps.py:
from django.apps import AppConfig
from django.utils.translation import ugettext_lazy as _


# class ArticlesConfig(AppConfig):
#     default_auto_field = 'django.db.models.BigAutoField'
#     name = 'apps.articles'

class AccountsConfig(AppConfig):
    """
    Articles app, integrating with django-allauth
    """
    label = 'articles'
    name = 'apps.articles'
    verbose_name = _('Articles')
文章\views.py:
from django.shortcuts import render


def home(request):
    return render(request, template_name='templates/articles/home.html')


def about(request):
    return render(request, template_name='templates/articles/about.html')
articles/init.py:
default_app_config = 'apps.articles.apps.AccountsConfig'

再次感谢上面的回答。这给了我让我越线所需的东西!愿这个综合答案支持未来的读者。

【讨论】:

  • 非常感谢您抽出宝贵时间(并分享您的方法经验)。我正在恢复到以前的工作版本,我将逐步完成,直到得到结果。
  • @Carewen 是的,我的示例中的ready() 不一定也适用于您的项目,只是您可以做的一个示例。如果您没有信号,则不需要。
  • @Carewen 我还在设置中添加了 2 个有用的路径以及如何在 TEMPLATES 设置中使用它们的示例,因为这可能对您来说更清楚。
  • 我尝试了这些路径,我得到:TypeError: unsupported operand type(s) for /: 'str' and 'str'。它导致数据库中断。通过 settings.py 更改 BASE_DIR 会产生级联影响。我将把工作解决方案推送到 github,看看我是否可以回过头来完善你的建议。
【解决方案2】:

问题似乎与:

INSTALLED_APPS = [
    'apps.articles.ArticlesConfig',

应该是:'apps.articles.apps.ArticlesConfig',

您的文章/apps.py 的内容也应该是:

from django.apps import AppConfig

class ArticlesConfig(AppConfig):
    default_auto_field = 'django.db.models.BigAutoField'
    name = 'apps.articles'

【讨论】:

  • 这是一个公平的观察。一个月后,这个应用程序有了很大的发展。好眼力。感谢您抽出宝贵时间。
猜你喜欢
  • 1970-01-01
  • 2020-05-17
  • 1970-01-01
  • 2022-12-27
  • 2022-12-05
  • 2020-12-13
  • 2017-09-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多