web-dev-qa-db-ja.com

「Django.core.exceptions.ImproperlyConfigured:アプリケーションラベルは一意ではなく、重複しています:foo」のDjango 1.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

問題は何ですか?どうすれば解決できますか?

52
John Carter

問題は、Django 1.7でのアプリの変更により、アプリに一意のラベルが必要になることです。

デフォルトでは、アプリのラベルはパッケージ名であるため、アプリモジュールの1つと同じ名前のパッケージ(この場合は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 を参照してください

79
John Carter

これに対する簡単な解決策を見つけました。私の場合、次の行がINSTALLED_APPSの下に2回追加されます。

'Django.contrib.foo',

1行削除すると、問題が修正されます。

54
user2989777

私は同じエラーが発生しました-これを試してください:

iNSTALLED_APPSで、「foo.apps.FooConfig」を含める場合、Djangoはアプリケーションにfooアプリを含めることをすでに知っているため、「foo」を含める必要はありません。 INSTALLED_APPSの下の「foo」と「foo.apps.FooConfig」の両方が問題の原因である可能性があります。

9
Sean

therefromhere はこれが新しいDjango 1.7 feature であるため、アプリケーションを一意に決定する必要がある一種の「アプリレジストリ」を追加します。異なるpython pathes)を持つだけではありません。

name属性はpythonパス(一意)ですが、labelも一意である必要があります。たとえば、「admin」という名前のアプリがある場合、名前(name = 'python.path)を定義する必要があります')およびラベルも一意でなければなりません(label =' my admin 'または前述のとおり、完全なpythonパスは常に一意です)。

3
gdoumenc

さて、authアプリを作成し、INSTALLED_APPのようなsrc.authに含めました(srcフォルダーにあるため)、このエラーが発生しました。 Django.contrib.authアプリでもあります。そこで、authenticationのように名前を変更し、問題を解決しました。

2
М.Б.

enter image description here 同じ問題が発生しました。ここで私のアプリ名はchatで、settings.pyで、インストール済みのアプリの下にchat.apps.ChatConfigを書きましたが、アプリ名のチャットは既に下部に含まれています。 chat.apps.ChatConfigを削除すると、マイニングの問題は移行中に解決されました。このエラーは、settings.pyでアプリ名fooを2回定義したのと同じインスタンスが原因である可能性があります。これがうまくいくことを願っています!!