8 votes

Espace de nom et nom d'application de Django 2

J'ai du mal à comprendre le lien entre app_name et namespace.

considérer le niveau du projet urls.py

from django.urls import path, include

urlpatterns = [
    path('blog/', include('blog.urls', namespace='blog')),
]

considérer le niveau de l'application (blog) urls.py

from django.urls import path
from . import views

app_name = 'blog'

urlpatterns = [
    path('', views.post_list, name='post_list'),
    path('<int:year>/<int:month>/<int:day>/<slug:post>/', views.post_detail, name='post_detail'),
]

si je commente app_name, j'obtiens ce qui suit.

'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.

Si je renomme app_name en une chaîne arbitraire, je n'obtiens pas d'erreur.

app_name = 'x'

J'ai lu la documentation mais ça ne marche toujours pas. Quelqu'un peut-il me dire comment/pourquoi le nom de l'application et l'espace de noms sont liés et pourquoi ils sont autorisés à avoir des valeurs de chaîne différentes ? La définition manuelle du nom de l'application n'est-elle pas superflue ?

3voto

Tony Kyriakidis Points 768

Essayez de supprimer app_name='blog'.

Dans votre cas, vous devriez utiliser :

'blog:post_list'

et

'blog:post_detail'

Vous pouvez également supprimer le namespace='blog' dans votre première url comme ceci :

urlpatterns = [
path('blog/', include('blog.urls')),

]

et ensuite, dans vos modèles, vous pouvez référencer les urls sans le "blog :....." :

'post_list'
'post_detail'

2voto

Firdaus Aziz Points 11

Essayez d'utiliser le tuple.

urlpatterns = [
    path('blog/', include(('blog.urls', 'blog'))),
]

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X