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")
]