Django 3.2.6:与 404 相关的应用 urls.py 中的路径顺序

Django 3.2.6: Path order in app urls.py related to 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 视图并吓坏了。

然而,当我颠倒这两个 url 的顺序时,一切正常。顺序重要吗?如果是这样的话,对于较大的项目来说就比较不方便了。

如果需要任何其他信息,请告诉我。

一个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>/<b>view</b>/<slug:slug>',communities_views.viewPostDetail,name="post_detail"),
    path('posts/delete_comment/<int:comment_id>',communities_views.viewDeleteComment,name="delete_comment")
]