Comportement bizarre résolution url en fonction de l'ordre des url
Salut la team, j'ai eu un problème avec la résolution d'url de django pour accéder à la vue create-post => tout simplement impossible jusqu'à ce que j'inverse l'ordre des url dansurls.py !
Voici l'ordre des urls qui ne fonctionne pas:
urlpatterns = [
path('admin/', admin.site.urls),
path('blog/', BlogIndexView.as_view(), name='blog-index'),
path('blog/<str:slug>/', PostDetailView.as_view(), name="blog-post"),
path('blog/create/', PostCreateView.as_view(), name="create-post"),
]
et le message d'erreur que j'obtiens ci-dessous:
Not Found: /blog/create/

Après 2 bonnes heures à tout passer en revue je décide d'inverser l'ordre des url blog-post et create-post et là hop mon formulaire apparaît!!!
urlpatterns = [
path('admin/', admin.site.urls),
path('blog/', BlogIndexView.as_view(), name='blog-index'),
path('blog/create/', PostCreateView.as_view(), name="create-post"),
path('blog/<str:slug>/', PostDetailView.as_view(), name="blog-post"),
]
C'est le message d'erreur
Raised by: blog.views.PostDetailView qui m'a incité à inverser => je me suis demandé ce que venait faire PostDetailView alors que j'appelais PostCreateView. Est-il possible que django ait confondu 'blog/<str:slug>/'avec 'blog/create/'??Voici le template avec le lien vers l'url
create-post:{% block content %}
<a href="{% url 'create-post' %}"> ajouter un article</a>
{% for post in articles %}
<a href="{% url 'blog-post' slug=post.slug %}">
<h1>{{ post.title }}</h1>
</a>
<p>{{ post.content|truncatewords:100|striptags|safe }}</p>
{% endfor %}
{% endblock %}
Merci à vous.
Salut !
Oui, c'est normal, j'en parle à un moment dans la formation, je ne suis plus sûr exactement où mais je montre exactement ce problème.
En fait ce qu'il se passe c'est que si tu mets l'URL pour la vue de détail en premier, Django va penser que create est le slug d'un article.
La raison c'est que les URL sont évaluées dans l'ordre, donc si une URL match ton motif, Django va retourner cette vue.
blog/create/ match avec ton motif blog/<str:slug>/ car create est une chaîne de caractère semblable à un slug.
Si tu inverses l'ordre des URL en mettant create en premier, quand tu te rends sur cette URL, le motif sera reconnu en premier et tu seras redirigé vers la vue PostCreateView au lieu de la vue de détail.
C'est pour cette raison qu'il est primordial de toujours mettre dans ces cas-ci tes URL les plus spécifiques en premier : si tu as des vues create, update, delete, etc, tu les mets en premier dans la liste des URL pour qu'elles soient bien redirigées avant les URL plus génériques qui contiennent un slug ou un pk.
Inscris-toi
(c'est gratuit !)
Tu dois créer un compte pour participer aux discussions.
Créer un compte