【问题标题】:Django 3.2.6: Path order in app urls.py related to 404Django 3.2.6:与 404 相关的应用程序 urls.py 中的路径顺序
【发布时间】:2022-01-03 06:07:04
【问题描述】:

我的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 的观点和吓坏了。

但是,当我颠倒这两个网址的顺序时,一切正常。顺序重要吗?如果是这样,这对于大型项目来说是相当不方便的。

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

【问题讨论】:

    标签: django django-urls


    【解决方案1】:

    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 = [
        # &downarrow; 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")
    ]

    【讨论】:

    • 完美!从来不知道关于蛞蝓,两者都像魅力一样工作。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-11-16
    • 2016-12-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-15
    • 1970-01-01
    相关资源
    最近更新 更多