在 Django 中使用 path() 找不到 404

Posted

技术标签:

【中文标题】在 Django 中使用 path() 找不到 404【英文标题】:Getting 404 not found using path() in Django 【发布时间】:2018-04-30 06:38:06 【问题描述】:

我只是在查看 django,并试图通过将 id 作为参数传递给 URL books/urls.py 来列出书籍。但是找不到 404 页面错误。当我在浏览器中输入这个 url 时,我没有得到 url 中的错误:

 http://192.168.0.106:8000/books/list/21/

书店/urls.py

urlpatterns = [
    path('admin/', admin.site.urls),
    path('books/', include("books.urls"))
] 

settings.py

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'books'
   ]
...
...
...
ROOT_URLCONF = 'bookstore.urls'

books/urls.py

urlpatterns = [
     path('home/', create),
     path('list/(?P<id>\d+)', list_view),
]

books/views.py

def create(request):
    form = CreateForm(request.POST or None, request.FILES or None)
    if form.is_valid():
        instance = form.save(commit=False)
        instance.save()
        messages.success(request, "Book Created")
        return redirect('/books/list', kwargs="id":instance.id)
    return render(request, "home.html", "form":form)


def list_view(request, id=None):
    books = Book.objects.filter(id=id)
    return render(request, "list.html", "books": books)

项目结构:

├── books
│   ├── admin.py
│   ├── forms.py
│   ├── __init__.py
│   ├── models.py
│   ├── urls.py
│   └── views.py
├── bookstore
│   ├── __init__.py
│   ├── settings.py
│   ├── urls.py

这是截图 -

编辑-如 cmets 中所述-尝试通过在books.urls 的 url 表达式中附加 / 但没有运气:(

【问题讨论】:

使用books = Book.objects.filter(id=id) 看起来有点奇怪。如果id 是这本书的ID,我希望看到book = Book.objects.get(id=id),或者可能是book = get_object_or_404(Book, id=id) @Alasdair - 实际上是 book_id 并且那些是重复的,所以将其替换为 id 作为测试的一部分。 另外,您的redirect 行错误地混合了硬编码的 URL 和 kwargs。您可以使用return redirect('/books/list/%s/' % instance.id) 构造 URL,或者推荐的方法是让 Django 使用 return redirect('list_view', kwargs=id:instance.id) 反转 URL。 @Alasdair - Create 工作正常,完全没有问题。在 URL 中传递 id 时,仅卡在列表视图中。也尝试在浏览器中手动输入 url。 相信我,redirect 是不正确的,即使它没有给您错误。我的猜测是反向会默默地失败,它会重定向到/books/list/,忽略kwargs。 【参考方案1】:

您错误地使用了 Django 2.0 中的新 path。你不应该使用像\d+ 这样的正则表达式。尝试将其更改为:

 path('list/<int:id>/', list_view, name='list_view'),

如果要反转 URL,则需要 name

如果你想坚持使用正则表达式,那么使用re_path(如果你想与旧版本的 Django 兼容,url() 仍然可以使用)。请参阅URL dispatcher docs 了解更多信息。

还要注意尾部斜杠 - 否则您的路径匹配 http://192.168.0.106:8000/books/list/21 但不匹配 http://192.168.0.106:8000/books/list/21/

【讨论】:

像魅力一样工作,非常感谢:)

以上是关于在 Django 中使用 path() 找不到 404的主要内容,如果未能解决你的问题,请参考以下文章

找不到页面的Django静态CSS(开发)

Django 找不到我的媒体文件(在开发服务器上)

Django 找不到静态(css)文件夹

找不到django模板

django前端怎么设置 静态文件路径

Django:Heroku 上的生产应用程序找不到带有“路径”urlpattern 的模板