在 Django 中使用 path() 找不到 404
Getting 404 not found using path() in Django
我刚刚查看了 django,并试图通过将 id
作为参数传递给 URL books/urls.py
来列出书籍。但是得到 404 page not found 错误。当我在浏览器中输入 url 时,url 没有出现问题:
http://192.168.0.106:8000/books/list/21/
bookstore/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
这是屏幕截图 -
编辑 - 如评论中所述 - 尝试在 books.urls
的 url 表达式中附加 /
但没有成功:(
您错误地使用了 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,并试图通过将 id
作为参数传递给 URL books/urls.py
来列出书籍。但是得到 404 page not found 错误。当我在浏览器中输入 url 时,url 没有出现问题:
http://192.168.0.106:8000/books/list/21/
bookstore/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
这是屏幕截图 -
编辑 - 如评论中所述 - 尝试在 books.urls
的 url 表达式中附加 /
但没有成功:(
您错误地使用了 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/
。