Django 3.2.6: Порядок путей в приложении urls.py связан с 404
У меня есть несколько путей в моем urls.py файле для приложения communities. Вот два из них, которые вызывают проблемы.
path('posts/<str:username>/<slug:slug>',communities_views.viewPostDetail,name="post_detail")
path('posts/delete_comment/<int:comment_id>',communities_views.viewDeleteComment,name="delete_comment")
По какой-то причине Django, кажется, запутался в порядке этих двух путей. Когда они расположены в таком порядке, как показано на рисунке, Django распознает, что delete_comment является путем (это означает, что в шаблонах использование чего-то вроде communities:delete_comment не приводит к ошибке при генерации шаблона), но при попытке перейти к url, Django продолжает ловить представление post_detail и выходит из себя.
Однако, когда я меняю порядок этих двух ссылок, все работает нормально. Имеет ли порядок значение? Если да, то это довольно неудобно для больших проектов.
Если необходима любая другая информация, пожалуйста, сообщите мне.
А slug:…> может также соответствовать последовательности цифр. Если вы таким образом посетите posts/delete_comment/123, то Django попытается сопоставить его с шаблонами URL и начнет с первого. Этот URL будет соответствовать шаблону posts/<str:username>/<slug:slug>/, поскольку он задает username = 'delete_comment' и slug = '123'.
Поскольку Django всегда запускает первый совпавший шаблон URL, если вы попытаетесь удалить комментарий, он запустит viewPostDetail.
Вы можете указать элементы в другом порядке:
urlpatterns = [
# ↓ first try to match with the delete_comment URL pattern
path('posts/delete_comment/<int:comment_id>',communities_views.viewDeleteComment,name="delete_comment"),
path('posts/<str:username>/<slug:slug>',communities_views.viewPostDetail,name="post_detail")
]
Другой вариант - сделать два шаблона URL, которые не пересекаются, например, с:
urlpatterns = [
# ↓ non-overlapping URLs
path('posts/<str:username>/view/<slug:slug>',communities_views.viewPostDetail,name="post_detail"),
path('posts/delete_comment/<int:comment_id>',communities_views.viewDeleteComment,name="delete_comment")
]