Django 1.7 应用配置导入错误:没有名为 appname.apps 的模块

11 投票
3 回答
23538 浏览
提问于 2025-04-21 01:57

我正在为我的一个Django应用程序“articles”设置自定义配置,参考了这份文档,但是每次执行./manage.py check(或者其他管理命令,比如./manage.py runserver)时,都会出现ImportError: No module named articles.apps的错误。

这是我项目的结构:

projectname
    ├── apps
    │   ├── articles
    │   │   ├── admin.py
    │   │   ├── apps.py
    │   │   ├── __init__.py
    │   │   ├── migrations
    │   │   │   ├── 0001_initial.py
    │   │   │   └── __init__.py
    │   │   ├── models.py
    │   │   ├── templates
    │   │   │   └── articles
    │   │   ├── templatetags
    │   │   │   ├── articles_tags.py
    │   │   │   └── __init__.py
    │   │   ├── tests.py
    │   │   ├── urls.py
    │   │   └── views.py
    │   ├── __init__.py

settings.py中安装的应用:

INSTALLED_APPS = (
  'grappelli',
  'django.contrib.admin', 
  'django.contrib.auth', 
  'django.contrib.contenttypes', 
  'django.contrib.sessions', 
  'django.contrib.messages',
  'django.contrib.staticfiles',
  'django.contrib.humanize', 
  'grappelli.dashboard', 
  'mptt', 
  'sekizai', 
  'pytils', 
  'sorl.thumbnail',
  'sefaro.apps.utils', 
  'sefaro.apps.seo', 
  'sefaro.apps.staticpages', 
  'sefaro.apps.statictext', 
  'sefaro.apps.usersettings', 
  'sefaro.apps.navigation', 
  'sefaro.apps.slideshow',
  'sefaro.apps.articles', 
) 

articles/__init__.py的内容:

# articles/__init__.py
default_app_config = 'articles.apps.ArticlesConfig'

articles/apps.py的内容:

# -*- coding: utf-8 -*-
from django.apps import AppConfig
from django.utils.translation import ugettext_lazy as _


class ArticlesConfig(AppConfig):

    name = 'articles'
    verbose_name = _(u'Articles')

在我的INSTALLED_APPS中有'projectname.apps.articles'

只是想确认我确实有这些文件,并且路径没有搞错。

>>> from projectname.apps.articles.apps import ArticlesConfig
>>> ArticlesConfig
<class 'projectname.apps.articles.apps.ArticlesConfig'>

所有的导入都没问题……

但是:

(vagrant)vagrant@vagrant-ubuntu-trusty-32:~/django$ ./manage.py check
Traceback (most recent call last):
  File "./manage.py", line 10, in <module>
    execute_from_command_line(sys.argv)
  File "/home/vagrant/local/lib/python2.7/site-packages/django/core/management/__init__.py", line 385, in execute_from_command_line
    utility.execute()
  File "/home/vagrant/local/lib/python2.7/site-packages/django/core/management/__init__.py", line 354, in execute
    django.setup()
  File "/home/vagrant/local/lib/python2.7/site-packages/django/__init__.py", line 21, in setup
    apps.populate(settings.INSTALLED_APPS)
  File "/home/vagrant/local/lib/python2.7/site-packages/django/apps/registry.py", line 85, in populate
    app_config = AppConfig.create(entry)
  File "/home/vagrant/local/lib/python2.7/site-packages/django/apps/config.py", line 112, in create
    mod = import_module(mod_path)
  File "/usr/lib/python2.7/importlib/__init__.py", line 37, in import_module
    __import__(name)
ImportError: No module named articles.apps

3 个回答

0

我觉得问题可能出在你的 articles/__init__.py 文件里。

我的意思是……文档里说:

当然,你也可以告诉用户把 'rock_n_roll.apps.RockNRollConfig' 加到他们的 INSTALLED_APPS 设置里。

你是不是试着删掉了 "default_app_config" 这一行,只把 articles.apps.ArticlesConfig 放进你的 INSTALLED_APPS 里?

我这么说是因为文档提到:

这样的话,当 INSTALLED_APPS 里只有 'rock_n_roll' 时,就会使用 RockNRollConfig。

如果在 articles/__init__.py 里声明了 default_apps_config,那么在你的 INSTALLED_APPS 里只需要:

INSTALLED_APPS = ( 'grappelli', 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'django.contrib.humanize', 'grappelli.dashboard', 'mptt', 'sekizai', 'pytils', 'sorl.thumbnail', 'sefaro.apps.utils', 'sefaro.apps.seo', 'sefaro.apps.staticpages', 'sefaro.apps.statictext', 'sefaro.apps.usersettings', 'sefaro.apps.navigation', 'sefaro.apps.slideshow', 'articles', )

也许我错了,但我会试试这个 :) 如果你需要更多帮助,告诉我哦。

1

应用程序配置中的名称属性应该和我们在已安装的应用中填写的名称一致。

另外,default_app_config 需要指向你自定义配置的正确路径,比如:

default_app_config = 'projectname.apps.articles.apps.ArticlesConfig
16

根据特定的Django项目结构(所有应用都放在 projectname/apps/ 这个模块里),我们需要使用包含项目名称的完整路径

正如文档中提到的 https://docs.djangoproject.com/en/dev/ref/applications/#django.apps.AppConfig.name

AppConfig.name

应用的完整Python路径,比如 'django.contrib.admin'。

所以应该是:

# articles/apps.py:
from django.apps import AppConfig
from django.utils.translation import ugettext_lazy as _


class ArticlesConfig(AppConfig):

    name = 'projectname.apps.articles'
    verbose_name = _(u'Articles')

还有

# articles/__init__.py
default_app_config = 'projectname.apps.articles.apps.ArticlesConfig'

撰写回答