2014-06-20 5 views
37

Na uaktualnieniu do Django 1.7 dostaję następujący komunikat o błędzie z ./manage.pyJak rozwiązać "django.core.exceptions.ImproperlyConfigured: Etykiety aplikacji nie są unikalne, duplikaty: foo" w Django 1.7?

$ ./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 

czym problem i jak mogę go rozwiązać?

Odpowiedz

61

Problem polega na tym, że przy zmianach w aplikacjach w Django 1.7 aplikacje muszą posiadać unikalną etykietę.

Domyślnie etykieta aplikacji to nazwa pakietu, więc jeśli masz pakiet o tej samej nazwie co jeden z modułów aplikacji (foo w tym przypadku), uderzysz w ten błąd.

Rozwiązaniem jest zastąpienie domyślnej etykiety dla aplikacji i wymuszenie załadowania tej konfiguracji przez dodanie jej do __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) 

i

# foo/__init__.py 

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

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

+2

PYTAJĄCY nie zaakceptował własnej odpowiedzi, ale jest ona poprawna. Kiedy to zrobisz, umieścisz "full.python.path.to.your.app.foo.apps.FooConfig" w swoim 'INSTALLED_APPS' i wszystko działa zgodnie z oczekiwaniami. – Brett

+0

Nie działa dla mnie –

+1

Chciałem tylko wspomnieć, że po dodaniu etykiety uruchom migrację w następujący sposób: Python manage.py makemigrations my.foo – 82din

-19

Jeśli chcesz utworzyć kopię starszej wersji, polecenie

pip install django==1.6.7 
+0

To tak naprawdę nie daje odpowiedzi. Pytanie brzmiało, co jest nie tak z aktualizacją i jak ją naprawić, aby uaktualnienie zadziałało. Przywrócenie starej wersji pozwala uniknąć problemu, ale go nie naprawia. – anaximander

+0

@anaximander - Próbują pomóc, więc jest to odpowiedź, nawet jeśli jest kiepska. Zgłaszaj to, jeśli ci się nie podoba, ale nie oznaczaj tego. Zobacz swoją odpowiedź znajduje się w innym zamku, gdy odpowiedź nie jest odpowiedzią: http://meta.stackexchange.com/questions/225370/your-answer-is-in-another-castle-when-is-an-answer- not-an-answer – ArtOfWarfare

+2

Na pytanie: "jak zrobić X w C#?" i ktoś odpowiedział "używaj Javy", co byłoby uznane za "nie odpowiedź". Na tym samym poziomie, gdy pytanie brzmi "jak rozwiązać ten problem w wersji 1.7", twierdzę, że "użyj wersji 1.6.7" również nie jest odpowiedzią. Odpowiedź brzmi "Jeśli chcesz wrócić do starszej wersji". Pytanie brzmi "jak przejść do nowszej wersji". Myślę, że to całkiem oczywiste. – anaximander

3

Jak therefromhere że jest to nowy Django 1.7 feature który dodaje rodzaj "rejestru aplikacji", gdzie muszą być aplikacje określone wyjątkowo (i nie tylko posiadające różne patche python).

atrybut name jest ścieżka pyton (unikalny), ale label powinno być również wyjątkowe. Na przykład, jeśli masz aplikację o nazwie "admin", musisz zdefiniować nazwę (name = 'python.path') i etykietę, która również musi być unikalna (label = "mój admin" lub jak powiedziałeś, umieścić pełny python ścieżka, która jest zawsze unikalna).

37

Znalazłem proste rozwiązanie. W moim przypadku dodaje się następujący wiersz dwukrotnie pod INSTALLED_APPS,

'django.contrib.foo', 

Usunięto jedna linia rozwiązuje problem dla mnie.

+0

miła obserwacja ... to był głupi błąd ... pracował dla mnie :) – jax

3

Miałem ten sam błąd - spróbuj tego:

w INSTALLED_APPS, jeśli w tym „foo.apps.FooConfig”, wtedy Django wie już zawierać aplikację foo we wniosku, nie ma zatem potrzeby również "foo". Posiadanie zarówno "foo", jak i "foo.apps.FooConfig" w INSTALLED_APPS może być źródłem twojego problemu.

1

Cóż, stworzyłem auth aplikację i podaję go w INSTALLED_APP jak src.auth (bo to w src folderze) i mam ten błąd, ponieważ nie jest django.contrib.auth aplikacja również. Zmieniono więc nazwę na taką jak authentication i problem został rozwiązany.

Powiązane problemy