Django 3.2.6: Порядок следования в приложении urls.py связано с 404

#django #django-urls

Вопрос:

У меня есть несколько путей в моем urls.py файле для приложения communities . Вот два из них, которые вызывают проблемы.

path('posts/lt;str:usernamegt;/lt;slug:sluggt;',communities_views.viewPostDetail,name="post_detail")

path('posts/delete_comment/lt;int:comment_idgt;',communities_views.viewDeleteComment,name="delete_comment")

По какой-то причине Джанго, похоже, путается в порядке этих двух путей. Когда в порядке, как показано, Django распознает, что delete_comment это путь (это означает, что в шаблонах, использующих что-то подобное communities:delete_comment , не возникает ошибка при создании шаблона), но при попытке перейти по URL-адресу Django продолжает захватывать post_detail представление и выходит из себя.

Однако, когда я меняю порядок этих двух URL-адресов, все работает нормально. Имеет ли значение порядок? Если это так, то это довольно неудобно для более крупных проектов.

Если потребуется какая-либо другая информация, пожалуйста, дайте мне знать.

Ответ №1:

A slug:…gt; также может соответствовать последовательности чисел. Если вы таким образом посетите posts/delete_comment/123 сайт , то Django попытается сопоставить его с шаблонами URL-адресов и начнет с первого. Этот URL-адрес будет соответствовать posts/lt;str:usernamegt;/lt;slug:sluggt;/ шаблону, так как он устанавливает username = 'delete_comment' и slug = '123' .

Поскольку Django всегда запускает первый соответствующий шаблон URL-адреса, если вы попытаетесь удалить комментарий, он, таким образом, сработает viewPostDetail .

Что вы можете сделать, так это указать товары в другом порядке:

 urlpatterns = [  # ↓ first try to match with the delete_comment URL pattern  path('posts/delete_comment/lt;int:comment_idgt;',communities_views.viewDeleteComment,name="delete_comment"),  path('posts/lt;str:usernamegt;/lt;slug:sluggt;',communities_views.viewPostDetail,name="post_detail") ] 

Другой вариант — создать два шаблона URL-адресов, которые не перекрываются, например, с:

 urlpatterns = [  # ↓ non-overlapping URLs  path('posts/lt;str:usernamegt;/view/lt;slug:sluggt;',communities_views.viewPostDetail,name="post_detail"),  path('posts/delete_comment/lt;int:comment_idgt;',communities_views.viewDeleteComment,name="delete_comment") ] 

Комментарии:

1. Идеально! Никогда не знал такого о слизняках, и то, и другое действует как заклинание.