Résolue

L'ordre des path dans urlspatterne a une importance ?

# Résolution d'erreurs # Django

Bonjour,
J'ai bug étrange sur l'url de ma vue "BlogPostCreate" crée précédement.
Tout fonctionnait jusqu'ici. J'avais ça comme ordre dans mes urlpatterns :

from django.urls import path
from posts.views import (
    BlogHome,
    BlogPostCreate,
    BlogPostUpdate,
)

app_name = "posts"

urlpatterns = [
    path('', BlogHome.as_view(), name='home'),
    path('create/', BlogPostCreate.as_view(), name='create'),
    path('edit/<str:slug>', BlogPostUpdate.as_view(), name='edit'),
]

Pour cette partie de la vidéo je crée la vue BlogPostDetail et je définie mes urls comme ceci :

#...

app_name = "posts"

urlpatterns = [
    path('', BlogHome.as_view(), name='home'),
    path('<str:slug>/', BlogPostDetail.as_view(), name='post'),
    path('create/', BlogPostCreate.as_view(), name='create'),
    path('edit/<str:slug>', BlogPostUpdate.as_view(), name='edit'),
]

Et là bug ma vue create ne focntionne plus et le reste oui !🤨

Et juste en changeant l'ordre des chemins, en mettant 'create' en deuxième position ça refonctionne :

app_name = "posts"

urlpatterns = [
    path('', BlogHome.as_view(), name='home'),
    path('create/', BlogPostCreate.as_view(), name='create'),
    path('<str:slug>/', BlogPostDetail.as_view(), name='post'),
    path('edit/<str:slug>', BlogPostUpdate.as_view(), name='edit'),
]

Est ce que c'est normale ? Dans la vidéo Thibault il met 'create en troisième position et ça fonctionne chez lui !?! 🤔

Thibault houdon

Mentor

Salut Ludo !

En fait, l'ordre des URL dans urlpatterns est vraiment important. Django parcourt ces URL de haut en bas et renvoie la première qui correspond à l'URL demandée.

Dans ton cas, si tu as ton URL de détail :

path('<str:slug>/', BlogPostDetail.as_view(), name='post')

avant celle de ta création :

path('create/', BlogPostCreate.as_view(), name='create')

Si tu as une URL comme 'tonsite.com/create/', Django verra que cela correspond parfaitement à path('<str:slug>/', ...) et il renvoie donc la vue 'BlogPostDetail'. </str:slug>

C'est pourquoi ta vue 'create' ne fonctionnait pas parce qu'elle est "interceptée" par la vue de détail, comme si tu voulais afficher l'article de blog dont le slug est "create".

En général, il est bon de mettre les URL les plus spécifiques en haut et les moins spécifiques en bas pour éviter ce genre de problèmes.

Dans le cas de ma vidéo, il me semble en parler plus loin ou dans une autre vidéo (je me souviens avoir eu ce soucis au moment d'enregistrer une vidéo et avoir rajouté une partie ou l'expliquer par la suite, je ne suis plus sûr où 😅).

Parce que dans mon cas j'ai le même problème, mon URL pour le détail va prendre le dessus sur les autres.

Ah ok, je te remercie pour cette précision.

Inscris-toi

(c'est gratuit !)

Inscris-toi

Tu dois créer un compte pour participer aux discussions.

Créer un compte

Rechercher sur le site

Formulaire de contact

Inscris-toi à Docstring

Pour commencer ton apprentissage.

Tu as déjà un compte ? Connecte-toi.