ImproperlyConfiguredError sur app_name lors de l'utilisation de l'espace de noms dans include ()

105

J'essaye actuellement Django. J'utilise l' namespaceargument dans l'un de mes include()s dans urls.py. Lorsque j'exécute le serveur et que j'essaye de naviguer, j'obtiens cette erreur.

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.

Voici mes fichiers urls.py:

#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)),
]

et

#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'),
]

Que dois-je transmettre app_namecomme indiqué dans le message d'erreur?

Nelson M
la source

Réponses:

152

Consultez les documents pour inclure ici .

Ce que vous avez fait n'est pas une manière acceptable de transmettre des paramètres à inclure. Vous pourriez faire:

url(r'^reviews/', include(('reviews.urls', 'reviews'), namespace='reviews')),
unixia
la source
J'ai juste essayé ceci et j'ai obtenu une autre erreur ... url (r '^ reviews /', include ('reviews.urls', namespace = 'reviews', app_name = 'reviews')), TypeError: include () a obtenu une erreur inattendue argument mot-clé 'app_name'
Nelson M
1
Extremement Désolé. Cela était censé être utilisé avec des modules et non avec des motifs. Veuillez vérifier la réponse mise à jour.
unixia
1
Cette solution m'a également été utile. Je suivais le tutoriel de django-oauth-toolkit.readthedocs.io/en/latest/tutorial / ... et il y a une instruction à faire: urlpatterns = [# OAuth 2 endpoints: url (r '^ o /', include ( oauth2_endpoint_views, namespace = "oauth2_provider")), url (r '^ api / hello', ApiEndpoint.as_view ()), # un exemple de point de terminaison de ressource]. Cela génère la même erreur que celle que vous avez mentionnée.
Koji D'infinte
1
La syntaxe de tuple ne fonctionnait pas pour moi, cela ne fonctionnait que lorsque j'ai changé (ma version de) reviews.urlpour avoir une app_namevariable dans django 2.1.
Herbert
Quel est le cas d'utilisation pour cela? J'ai beaucoup d'urls incluses dans mon projet et toutes avec le même modèle: path("the_app/", include(("app.urls", <name>), namespace=<the same name>))et c'est assez ennuyeux.
user4052054
80

Django 1.11+, 2.0+

Vous devez définir l'app_name dans le fichier urls que vous incluez

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

app_name = 'reviews'
     

Ensuite, vous pouvez l'inclure comme vous le faites.

En outre, il peut être intéressant de noter ce que la documentation Django dit ici https://docs.djangoproject.com/en/1.11/ref/urls/#include :

Obsolète depuis la version 1.9: la prise en charge de l'argument app_name est obsolète et sera supprimée dans Django 2.0. Spécifiez l'app_name comme expliqué dans les espaces de noms d'URL et les URLconfs incluses à la place.

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

Bob
la source
32

Django 2.0, vous devez spécifier app_name dans votre urls.py , il n'est pas nécessaire de spécifier l'argument app_name sur include.

Fichier URL principal.

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

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

URL incluse.

from django.urls import path
from . import views

app_name = 'main_app'

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

Ensuite, utilisez utiliser dans le modèle comme

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

Plus de détails: https://code.djangoproject.com/ticket/28691 Django 2.0 Docs

Brayan Loayza
la source
2
je me demande, à quoi sert app_name = "main"? et comment django utilise cette variable
Kanishk Tanwar
4

J'ai inclus une bibliothèque qui n'est pas (entièrement) compatible avec django 2.1 (django_auth_pro_saml2). Par conséquent, je crée un deuxième fichier saml_urls.py:

from django_saml2_pro_auth.urls import urlpatterns

app_name = 'saml'

Telle que je pourrais inclure les URL comme:

from django.urls import include, re_path as url

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

Hacky, mais cela a fonctionné pour moi, alors que ce url(r'^reviews/', include(('reviews.urls', 'reviews'), namespace='reviews'))n'était pas le cas.

Herbert
la source
0

Je suis également confronté à la même erreur dans Django 2.2 et je le résolve de cette façon

fichier urls.py

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

fichier polls / urls.py

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

exemple d'utilisation de l'espace de noms dans la méthode de vue basée sur calss

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

exemple d'utilisation de l'espace de noms dans les modèles

{% url 'polls:index' %}

Ici sondages: index signifie app_name [définir dans le fichier polls / urls.py ]: nom [définir dans le fichier polls / urls.py à l' intérieur de la fonction de chemin]

leur officiel qui est plutôt bon, vous pouvez vérifier pour plus d'informations namespace_django_official_doc

Sayalok
la source