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