在我的 core/urls.py 文件中找不到 Django 页面 (404)。仅在重新排列网址时有效

Django page not found (404) in my core/urls.py file. Only works when the urls are rearranged

我对 Django 比较陌生。我已经以这种方式在我的 core/urls.py 文件中设置了我的 URL,当我在浏览器上打开 localhost:8000/posts/ 时确实收到了 404 错误。代码显示在这里

urlpatterns = [
    path('', views.IndexView.as_view(), name='index'),
    path('<slug:slug>/', views.SingleView.as_view(), name='single'),
    path('posts/', views.PostsView.as_view(), name='posts'),
]

但是,当我反转 slugposts/ 以使 posts 位于 slug 之前时,一切正常。像这样:

urlpatterns = [
    path('', views.IndexView.as_view(), name='index'),
    path('posts/', views.PostsView.as_view(), name='posts'),
    path('<slug:slug>/', views.SingleView.as_view(), name='single'),
]

请帮我解决一下。

这就是 Django(和大多数其他框架)的工作方式。当收到请求时,Django 将检查您指定的路由,并使用您指定的相同顺序。因此,在您的第一个示例中,'' 是第一个,然后是 '<slug:slug>/''posts/'。这意味着每次收到请求时,Django 都会检查该订单上的路由。 for 循环的基本工作原理:

示例 URL:yoursite.com/posts/

路径:"posts/"

routes = ["", "<slug:slug>/", "posts/"]
path = "posts/"
for route in routes:
    if route == path:
        # use view for this route
        return

所以在这种情况下,它将匹配索引 1,即 <slug:slug>/,并且 return 是为其指定的视图。

现在要理解为什么 <slug:slug>/ == "posts/" returns True 你需要理解 slug 在 Django 中的含义:

slug - Matches any slug string consisting of ASCII letters or numbers, plus the hyphen and underscore characters. https://docs.djangoproject.com/en/3.1/topics/http/urls/#example

因此它将接受符合这些要求的任何路径,并且 posts/ 实际上符合这些要求。如果 Django 找到匹配项,它不会检查任何其他路由,因此它永远不会到达 path('posts/', views.PostsView.as_view(), name='posts'),因为 '<slug:slug>/' 在较小的索引中比 'posts/' 具有更高的优先级。你可能会检查你的模型中不存在的那个 slug,所以它会 return 一个 404.

通过更改路线顺序,您将路线更改为 ["", "posts/", "<slug:slug>/"]。现在 "posts/" 具有更高的优先级,django 将使用 PostsView.