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")
]
Вернуться на верх