web-dev-qa-db-fra.com

Comment résoudre "Django.core.exceptions.ImproperlyConfigured: les étiquettes d'application ne sont pas uniques, les doublons: foo" dans Django 1.7?

Lors de la mise à niveau vers Django 1.7, le message d'erreur suivant de ./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

Quel est le problème et comment puis-je le résoudre?

52
John Carter

Le problème est qu'avec les modifications apportées aux applications dans Django 1.7, les applications doivent posséder une étiquette unique.

Par défaut, le libellé de l'application correspond au nom du package. Par conséquent, si vous disposez d'un package portant le même nom que l'un de vos modules d'application (foo dans ce cas), vous obtiendrez cette erreur.

La solution consiste à remplacer l'étiquette par défaut de votre application et à forcer le chargement de cette configuration en l'ajoutant à __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)

et

# foo/__init__.py

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

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

79
John Carter

J'ai trouvé une solution simple pour cela. Dans mon cas, la ligne suivante est ajoutée deux fois sous INSTALLED_APPS,

'Django.contrib.foo',

Suppression d'une ligne résout le problème pour moi.

54
user2989777

J'ai eu la même erreur - essayez ceci:

dans INSTALLED_APPS, si vous incluez 'foo.apps.FooConfig', alors Django sait déjà inclure l'application foo dans l'application, il n'est donc pas nécessaire d'inclure également 'foo'. Avoir 'foo' et 'foo.apps.FooConfig' sous INSTALLED_APPS peuvent être la source de votre problème.

9
Sean

Comme à partir de là dit ceci est un nouveau Django 1.7 fonctionnalité qui ajoute une sorte de "registre d'applications" où les applications doivent être déterminées de manière unique (et non seulement avoir différents python chemins).

L'attribut name est le chemin python (unique)), mais le label devrait également être unique. Par exemple, si vous avez une application nommée 'admin', vous devez définir le nom (name = 'python.path ') et une étiquette qui doit aussi être unique (label =' mon administrateur 'ou comme dit le mettre en entier python chemin qui est toujours unique).

3
gdoumenc

Eh bien, j'ai créé l'application auth et je l'ai incluse dans INSTALLED_APP comme src.auth (car il est dans le dossier src) et j’ai eu cette erreur, car il y a Django.contrib.auth app aussi. Donc, je l'ai renommé comme authentication et le problème a été résolu.

2
М.Б.

enter image description here J'ai le même problème. Ici, mon nom d’application était chat et dans le fichier settings.py, sous les applications installées, j’ai écrit chat.apps.ChatConfig alors que j’avais déjà inclus la discussion du nom de l’application en bas. Lorsque j'ai supprimé le problème de mine chat.apps.ChatConfig, il a été résolu lors des migrations. Cette erreur peut être due à la même instance que vous avez peut-être définie deux fois dans le nom de l'application dans le fichier settings.py. J'espère que ça marche !!

1