【问题标题】:How to resolve "django.core.exceptions.ImproperlyConfigured: Application labels aren't unique, duplicates: foo" in Django 1.7?如何在 Django 1.7 中解决“django.core.exceptions.ImproperlyConfigured:应用程序标签不是唯一的,重复:foo”?
【发布时间】:2019-09-09 10:17:06
【问题描述】:

在升级到 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

有什么问题,我该如何解决?

【问题讨论】:

  • 您在INSTALLED_APPS 中可能有两次相同的应用程序。
  • 我的问题已解决,谢谢

标签: django django-1.7


【解决方案1】:

问题是随着 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

【讨论】:

  • 提问者不接受自己的答案,但它是正确的。完成此操作后,将 'full.python.path.to.your.app.foo.apps.FooConfig' 放入您的 INSTALLED_APPS 中,一切都会按预期进行。
  • 只是想提一下,一旦添加了标签,就可以像这样运行迁移:python manage.py makemigrations my.foo
  • 这是否适用于具有现有数据库表的应用程序?在进行这些更改后进行迁移时,我收到“依赖项引用不存在的父节点”错误。
  • @John_Carter 'full.python.path.to.your.app.foo' 通常看起来像什么?是否涉及os.path?它来自项目根目录吗?
  • 根据我的观察,最好避免标签名称中的点。问题在于:AUTH_USER_MODEL = 'apps.auth.User'(不起作用)。将标签名称和 AUTH_USER_MODEL 更改为“apps_auth.User”解决了问题。
【解决方案2】:

我为此找到了简单的解决方案。在我的情况下,以下行在 INSTALLED_APPS 下添加了两次,

'django.contrib.foo',

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

【讨论】:

  • 很好的观察...这是一个愚蠢的错误..为我工作:)
  • 就我而言,有两个django.contrib.staticfiles。 tnx 很多 =)
【解决方案3】:

我遇到了同样的错误 - 试试这个:

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

【讨论】:

    【解决方案4】:

    好吧,我创建了一个auth 应用程序,并将它包含在INSTALLED_APP 中,例如src.auth(因为它在src 文件夹中)并得到了这个错误,因为还有django.contrib.auth 应用程序。所以我把它重命名为authentication,问题就解决了!

    【讨论】:

      【解决方案5】:

      请检查 settings.py 的 INSTALLED_APPS 中是否有重复内容

      【讨论】:

        【解决方案6】:

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

        【讨论】:

          【解决方案7】:

          如果 AppConfig 类本身的名称与项目中另一个类的名称匹配,也可能引发此异常。例如:

          class MessagesConfig(AppConfig):
              name = 'mysite.messages'
          

          class MessagesConfig(AppConfig):
              name = 'django.contrib.messages'
          

          即使每个配置的名称属性不同,也会发生冲突。

          【讨论】:

            【解决方案8】:

            在之前的answer'django.contrib.foo',中提到过,但是基本上添加任何应用两次都会导致这个错误只需删除一个(Django 3.0)

            对我来说,它位于 settings.py

            INSTALLED_APPS = [
              ...
              'accounts.apps.AccountsConfig',
              'accounts.apps.AccountsConfig',
              ...
            ]
            

            删除其中一个

            【讨论】:

              【解决方案9】:

              基本上这个问题是由于设置中安装的应用程序名称重复造成的:

              这就是我解决问题的方法。在 settings.py 文件中:

              • 如果安装应用重复,请检查setting.py中的安装应用

              • 由于应用名称重复而显示错误

              • 删除安装文件中的重复名称

              • 问题解决后,您会在屏幕上看到界面

              为此,我将应用程序名称创建为 polls 而不是 foo

              【讨论】:

                【解决方案10】:

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

                name 属性是 python 路径(唯一),但 label 也应该是唯一的。例如,如果您有一个名为“admin”的应用程序,那么您必须定义名称(name='python.path')和一个必须也是唯一的标签(label='my admin' 或如前所述放置完整的 python路径总是唯一的)。

                【讨论】:

                  【解决方案11】:

                  有同样的问题,通读根文件夹的 settings.py,删除任何导致冲突的 INSTALLED 应用程序......工作正常。将不得不重命名应用程序名称

                  【讨论】:

                    【解决方案12】:

                    在我的情况下,在 mysite settings.py 中,在 INSTALLED_APPS 数组变量中,我错误地将应用程序的名称输入了两次。

                    【讨论】:

                      【解决方案13】:

                      我几乎遇到了同样的问题。

                      ```File "/Users/apples/.local/share/virtualenvs/ecommerce-pOPGWC06/lib/python3.7/site-packages/django/apps/registry.py", line 95, in populate
                      "duplicates: %s" % app_config.label)
                      

                      django.core.exceptions.ImproperlyConfigured:应用程序标签不是唯一的,重复:auth```

                      我已经安装了 Django.contrib.auth 两次。我删除了一个,它运行良好。

                      【讨论】:

                        【解决方案14】:

                        需要签入两个文件

                        1-apps.py

                        代码类似

                        from django.apps import AppConfig
                        from django.utils.translation import ugettext_lazy as _
                        class ModuleConfig(AppConfig):
                            name = "ocb.module_name"
                            verbose_name = _("Module Name")
                        

                        2 - 初始化.py 编写类似

                        的代码
                        default_app_config = "ocb.users.apps.ModuleConfig"
                        

                        default_app_config 指向你的apps.py 的类名

                        【讨论】:

                          【解决方案15】:

                          根据我的经验,这个异常掩盖了真正的错误。要查看真正的错误(在我的例子中是一个已卸载的 python 包),请在 django/apps/registry.py 中注释掉以下内容:

                          if app_config.label in self.app_configs:
                              # raise ImproperlyConfigured(
                              #     "Application labels aren't unique, "
                              #     "duplicates: %s" % app_config.label)
                              pass
                          

                          【讨论】:

                            【解决方案16】:

                            检查 settings.py 中 INSTALLED_APPS 中的重复项...如果是,请删除其中一个并重新运行命令

                            【讨论】:

                            【解决方案17】:

                            当我尝试在新环境中测试我现有的 Django 应用程序时,我收到了Django==3.2.9。我遇到了这个确切的问题,并通过降级到Django==3.1.13 来解决它。

                            应用程序似乎有更新,请查看Django 3.2 documentation 了解详细信息。

                            【讨论】:

                              【解决方案18】:

                              如果您在 settings.py 中添加了应用名称 如图所示的示例比IN settings.py 删除它并尝试这对我有用。 试一试 。 这行得通,因为 settings.py 假设安装了两次并且不允许迁移

                              【讨论】:

                                【解决方案19】:

                                如果你想备份旧版本,命令

                                pip install django==1.6.7
                                

                                【讨论】:

                                • 这并没有真正给出答案。问题是升级出了什么问题,以及如何修复它以使升级正常工作。回滚到旧版本可以避免问题,但不能解决问题。
                                • @anaximander - 他们正在努力提供帮助,因此这是一个答案,即使它是一个可怜的答案。如果您不喜欢它,请投反对票,但不要标记它。看到你的答案在另一个城堡里,当答案不是答案时:meta.stackexchange.com/questions/225370/…
                                • 关于“我如何在 C# 中执行 X?”的问题有人回答“使用 Java”,这将被视为“不是答案”。同样,当问题是“如何在 1.7 版中解决此问题”时,我认为“使用 1.6.7 版”也不是答案。答案是“如果你想 [go] 回到 [an] 旧版本”。问题是“我如何升级到较新的版本”。我认为这是不言而喻的。
                                • @anaximander 感谢您的评论。我同意你的看法。作为我的“答案”的内容是如此之短,没有其他理由我返回旧版本。我只是像我的情况一样写信息。当我尝试 v1.7 时,我遇到了同样的问题。这个问题的信息很少,所以我的答案是当时恢复到旧版本。我判断我的案子对某些人有帮助。总有一天,当这些信息被专用时,这个答案会被深深地否决。欢迎评价!我很高兴这次讨论。由衷的感谢!你们是stackoverflow的力量。
                                • 只是一个小提示。如果您删除此答案,您将恢复您的分数;)
                                猜你喜欢
                                • 2015-01-29
                                • 2017-10-28
                                • 1970-01-01
                                • 2014-10-13
                                • 2018-10-16
                                • 2014-12-05
                                • 2020-04-10
                                • 2021-10-21
                                相关资源
                                最近更新 更多