ImproperlyConfiguredError über app_name bei Verwendung des Namespace in include ()


103

Ich probiere gerade Django aus. Ich benutze das namespaceArgument in einem meiner include()s in urls.py. Wenn ich den Server starte und versuche zu surfen, wird dieser Fehler angezeigt.

File "C:\Users\User\AppData\Local\Programs\Python\Python36-32\lib\site-packages\django\urls\conf.py", line 39, in include
    'Specifying a namespace in include() without providing an app_name '
django.core.exceptions.ImproperlyConfigured: Specifying a namespace in include() without providing an app_name is not supported. Set the app_name attribute in the included module, or pass a 2-tuple containing the list of patterns and app_name instead.

Dies sind meine urls.py-Dateien:

#project/urls.py

from django.conf.urls import include, url
from django.contrib import admin

urlpatterns = [
    url(r'^reviews/', include('reviews.urls', namespace='reviews')),
    url(r'^admin/', include(admin.site.urls)),
]

und

#app/urls.py

from django.conf.urls import url

from . import views

urlpatterns = [
    # ex: /
    url(r'^$', views.review_list, name='review_list'),
    # ex: /review/5/
    url(r'^review/(?P<review_id>[0-9]+)/$', views.review_detail, name='review_detail'),
    # ex: /wine/
    url(r'^wine$', views.wine_list, name='wine_list'),
    # ex: /wine/5/
    url(r'^wine/(?P<wine_id>[0-9]+)/$', views.wine_detail, name='wine_detail'),
]

Was übergebe ich app_namewie in der Fehlermeldung angegeben?

Antworten:


151

Überprüfen Sie die Dokumente auf Aufnahme hier .

Was Sie getan haben, ist keine akzeptable Methode zum Übergeben von Parametern. Du könntest es tun:

url(r'^reviews/', include(('reviews.urls', 'reviews'), namespace='reviews')),

Ich habe es gerade ausprobiert und einen weiteren Fehler erhalten ... url (r '^ reviews /', include ('reviews.urls', namespace = 'reviews', app_name = 'reviews')), TypeError: include () hat ein unerwartetes Ergebnis erhalten Schlüsselwort Argument 'app_name'
Nelson M

1
Sehr leid. Das sollte mit Modulen verwendet werden, nicht mit Mustern. Bitte überprüfen Sie die aktualisierte Antwort.
Unixia

1
Diese Lösung war auch für mich hilfreich. Ich habe das Tutorial von django-oauth-toolkit.readthedocs.io/en/latest/tutorial/… befolgt und es gibt eine Anweisung dazu: urlpatterns = [# OAuth 2 Endpunkte: url (r '^ o /', include ( oauth2_endpoint_views, namespace = "oauth2_provider")), url (r '^ api / hello', ApiEndpoint.as_view ()), # ein Beispiel für einen Ressourcenendpunkt]. Dies erzeugt den gleichen Fehler wie Sie erwähnt haben.
Koji D'infinte

1
Die Tupel-Syntax hat bei mir nicht funktioniert, sondern nur, wenn ich (meine Version von) geändert habe reviews.url, um eine app_nameVariable zu haben django 2.1.
Herbert

Was ist der Anwendungsfall dafür? Ich habe viele URLs in mein Projekt aufgenommen und alle mit dem gleichen Muster: path("the_app/", include(("app.urls", <name>), namespace=<the same name>))und es ist ziemlich nervig.
user4052054

80

Django 1.11+, 2.0+

Sie sollten den App-Namen in der URL-Datei festlegen, die Sie einschließen

# reviews/urls.py  <-- i.e. in your app's urls.py

app_name = 'reviews'
     

Dann können Sie es so einfügen, wie Sie es tun.

Es könnte auch erwähnenswert sein, was Django-Dokumente hier sagen : https://docs.djangoproject.com/de/1.11/ref/urls/#include :

Veraltet seit Version 1.9: Die Unterstützung für das Argument app_name ist veraltet und wird in Django 2.0 entfernt. Geben Sie den Anwendungsnamen an, wie in URL-Namespaces erläutert, und fügen Sie stattdessen URLconfs hinzu.

( https://docs.djangoproject.com/de/1.11/topics/http/urls/#namespaces-and-include )


31

Django 2.0 sollten Sie app_name in Ihrer urls.py angeben , ist nicht erforderlich, um app_name Argument in include anzugeben.

Haupt-URL-Datei.

from django.contrib import admin
from django.urls import path, include

urlpatterns = [
    path('', include('apps.main.urls')),
    path('admin/', admin.site.urls),
]

Enthaltene URL.

from django.urls import path
from . import views

app_name = 'main_app'

urlpatterns = [
    path('', views.index, name='index'),
]

Verwenden Sie dann Verwendung in Vorlage als

<a href="{% url main_app:index' %}"> link </a>

Weitere Details: https://code.djangoproject.com/ticket/28691 Django 2.0 Docs


2
Ich frage mich, was ist die Verwendung von app_name = "main"? und wie Django diese Variable benutzt
Kanishk Tanwar

4

Ich habe eine Bibliothek aufgenommen, die noch nicht (vollständig) mit Django 2.1 kompatibel ist (django_auth_pro_saml2). Daher erstelle ich eine zweite Datei saml_urls.py:

from django_saml2_pro_auth.urls import urlpatterns

app_name = 'saml'

So dass ich die URLs wie folgt einfügen könnte:

from django.urls import include, re_path as url

urlpatterns = [
    ..., url(r'', include('your_app.saml_urls', namespace='saml')), ...
]

Hacky, aber es hat bei mir funktioniert, während das url(r'^reviews/', include(('reviews.urls', 'reviews'), namespace='reviews'))nicht der Fall war .


0

Ich habe auch den gleichen Fehler in Django 2.2 und löse ihn auf diese Weise

urls.py Datei

urlpatterns = [
   path('publisher-polls/', include('polls.urls', namespace='publisher-polls')),
]

polls / urls.py Datei

app_name = 'polls'
urlpatterns = [
  path('', views.IndexView.as_view(), name='index')
]

Beispiel für die Verwendung eines Namespace in einer auf Calss basierenden Ansichtsmethode

def get_absolute_url(self):
    from django.urls import reverse
    return reverse('polls.index', args=[str(self.id)])

Beispiel für die Verwendung eines Namespace in Vorlagen

{% url 'polls:index' %}

Hier Umfragen: Index bedeutet Anwendungsname [in der Datei polls / urls.py definieren ]: Name [in der Datei polls / urls.py innerhalb der Pfadfunktion definieren ]

Ihr Beamter, der ziemlich gut ist, können Sie für weitere Informationen Namespace_django_official_doc überprüfen


-6

In meinem Fall habe ich die URLs außerhalb der URL-Musterliste geschrieben. Bitte nochmal nachprüfen.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.