如何在Django 1.7中解决“django.core.exceptions.ImproperlyConfigured:应用程序标签不唯一,重复:foo”?

问题描述 投票:47回答:7

在升级到Django 1.7时,我从./manage.py收到以下错误消息

$ ./manage.py 
Traceback (most recent call last):
  File "./manage.py", line 16, in <module>
    execute_from_command_line(sys.argv)
  File "/home/johnc/.virtualenvs/myproj-django1.7/local/lib/python2.7/site-packages/django/core/management/__init__.py", line 427, in execute_from_command_line
    utility.execute()
  File "/home/johnc/.virtualenvs/myproj-django1.7/local/lib/python2.7/site-packages/django/core/management/__init__.py", line 391, in execute
    django.setup()
  File "/home/johnc/.virtualenvs/myproj-django1.7/local/lib/python2.7/site-packages/django/__init__.py", line 21, in setup
    apps.populate(settings.INSTALLED_APPS)
  File "/home/johnc/.virtualenvs/myproj-django1.7/local/lib/python2.7/site-packages/django/apps/registry.py", line 89, in populate
    "duplicates: %s" % app_config.label)
django.core.exceptions.ImproperlyConfigured: Application labels aren't unique, duplicates: foo

有什么问题,如何解决?

django django-1.7
7个回答
77
投票

问题是,随着Django 1.7中应用程序的更改,应用程序需要具有唯一标签。

默认情况下,应用程序标签是包名称,因此如果您有一个与您的某个应用程序模块同名的包(在本例中为foo),您将遇到此错误。

解决方案是覆盖应用程序的默认标签,并通过将其添加到__init__.py来强制加载此配置。

# foo/apps.py

from django.apps import AppConfig

class FooConfig(AppConfig):
    name = 'full.python.path.to.your.app.foo'
    label = 'my.foo'  # <-- this is the important line - change it to anything other than the default, which is the module name ('foo' in this case)

# foo/__init__.py

default_app_config = 'full.python.path.to.your.app.foo.apps.FooConfig'

https://docs.djangoproject.com/en/1.7/ref/applications/#for-application-authors


53
投票

我找到了简单的解决方案。在我的情况下,在INSTALLED_APPS下添加两行后续行,

'django.contrib.foo',

删除了一行为我解决了这个问题。


8
投票

我有同样的错误 - 试试这个:

在INSTALLED_APPS中,如果你包含'foo.apps.FooConfig',那么Django已经知道在应用程序中包含foo应用程序,因此不需要也包含'foo'。在INSTALLED_APPS下同时拥有'foo'和'foo.apps.FooConfig'可能是您问题的根源。


3
投票

正如therefromhere所说,这是一个新的Django 1.7 feature,它增加了一种“应用程序注册表”,其中应用程序必须唯一确定(并且不仅具有不同的python pathes)。

name属性是python路径(唯一),但label也应该是唯一的。例如,如果你有一个名为'admin'的应用程序,那么你必须定义名称(name ='python.path')和一个必须也是唯一的标签(label ='my admin'或者说是完整的python路径永远是独一无二的)。


1
投票

好吧,我创建了auth应用程序,我把它包括在INSTALLED_APPsrc.auth(因为它在src文件夹),我得到了这个错误,因为还有django.contrib.auth应用程序。所以我把它重命名为authentication,问题解决了。


1
投票

我遇到了同样的问题。这里我的应用程序名称是聊天,在settings.py中,在已安装的应用程序下,我已经编写了chat.apps.ChatConfig,而我已经在底部包含了应用程序名称聊天。当我删除chat.apps.ChatConfig时,我的问题在迁移时得到了解决。此错误可能是由于您在settings.py中为应用程序名称foo定义了两次的相同实例。我希望这能解决!!


-23
投票

如果要返回旧版本,请执行命令

pip install django==1.6.7
© www.soinside.com 2019 - 2024. All rights reserved.