找不到页面 (404) - 没有 Post 匹配给定的查询
Page not found (404) - No Post matches the given query
我正在开发 Django 博客,并为 post 标题实现了 slug 我偶然发现了一个问题。
错误是
Page not found (404)
Request Method: GET
Request URL: http://localhost:8000/post/new/
Raised by: blog.views.post_detail
No Post matches the given query.
这是我的urls.py
from django.conf.urls import include, url
from . import views
from django.conf import settings
from django.conf.urls.static import static
urlpatterns = [
url(r'^$', views.post_list),
url(r'^register', views.register),
url(r'^activate/(?P<activation_key>\w+)/', views.register_confirm),
url(r'^email_check', views.email_check),
url(r'^password_check', views.password_check),
url(r'^login', views.login),
url(r'^edit/$', views.update_profile),
url(r'^post/(?P<slug>[-_\w]+)/$', views.post_detail),
url(r'^post/new/$', views.post_new, name='post_new'),
url(r'^post/(?P<slug>[-_\w]+)/edit/$', views.post_edit, name='post_edit'),
url(r'^drafts/$', views.post_draft_list, name='post_draft_list'),
url(r'^post/(?P<slug>[-_\w]+)/publish/$', views.post_publish, name='post_publish'),
url(r'^post/(?P<slug>[-_\w]+)/remove/$', views.post_remove, name='post_remove'),
url(r'^post/(?P<slug>[-_\w]+)/comment/$', views.add_comment_to_post, name='add_comment_to_post'),
url(r'^comment/(?P<slug>[-_\w]+)/approve/$', views.comment_approve, name='comment_approve'),
url(r'^comment/(?P<slug>[-_\w]+)/remove/$', views.comment_remove, name='comment_remove'),
] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
view.py文件
@login_required
def post_new(request):
if request.method == "POST":
form = PostForm(request.POST)
if form.is_valid():
post = form.save()
post.author = request.user
post.published_date = timezone.now()
post.save()
return redirect('blog.views.post_detail', slug=post.slug)
else:
form = PostForm()
return render(request, 'blog/post_new.html', {'form': form})
说是"post_detail"报错,所以这里是
def post_detail(request, slug):
post = get_object_or_404(Post, slug=slug)
return render(request, 'blog/post_detail.html', {'post': post})
我错过了什么?
这是因为 new
匹配正则表达式 [-_\w]+
。
您必须重新排序 url 模式中的 url 个条目
改变这个:
url(r'^post/(?P<slug>[-_\w]+)/$', views.post_detail),
url(r'^post/new/$', views.post_new, name='post_new'),
有了这个:
url(r'^post/new/$', views.post_new, name='post_new'),
url(r'^post/(?P<slug>[-_\w]+)/$', views.post_detail),
解释:
代码中的 post_detail
url 条目在 post_new
url 之前计算。这使 post_detail
优先于 post_new
。
因为 post_detail
url 是 /post/
+ 任何匹配 [-_\w]+
和 new
匹配正则表达式的东西,Django 认为您将 new
作为 slug
传递给 post_detail
视图,并将其作为关键字参数传递给视图。由于没有 post 和 new
作为 slug,视图 returns 404 Not found
.
当 post_new
高于 post_detail
时,/post/new/
指向 post_new
视图并且 /post/
+ 任何具有正则表达式匹配的内容指向 post_detal
.
我正在开发 Django 博客,并为 post 标题实现了 slug 我偶然发现了一个问题。
错误是
Page not found (404)
Request Method: GET
Request URL: http://localhost:8000/post/new/
Raised by: blog.views.post_detail
No Post matches the given query.
这是我的urls.py
from django.conf.urls import include, url
from . import views
from django.conf import settings
from django.conf.urls.static import static
urlpatterns = [
url(r'^$', views.post_list),
url(r'^register', views.register),
url(r'^activate/(?P<activation_key>\w+)/', views.register_confirm),
url(r'^email_check', views.email_check),
url(r'^password_check', views.password_check),
url(r'^login', views.login),
url(r'^edit/$', views.update_profile),
url(r'^post/(?P<slug>[-_\w]+)/$', views.post_detail),
url(r'^post/new/$', views.post_new, name='post_new'),
url(r'^post/(?P<slug>[-_\w]+)/edit/$', views.post_edit, name='post_edit'),
url(r'^drafts/$', views.post_draft_list, name='post_draft_list'),
url(r'^post/(?P<slug>[-_\w]+)/publish/$', views.post_publish, name='post_publish'),
url(r'^post/(?P<slug>[-_\w]+)/remove/$', views.post_remove, name='post_remove'),
url(r'^post/(?P<slug>[-_\w]+)/comment/$', views.add_comment_to_post, name='add_comment_to_post'),
url(r'^comment/(?P<slug>[-_\w]+)/approve/$', views.comment_approve, name='comment_approve'),
url(r'^comment/(?P<slug>[-_\w]+)/remove/$', views.comment_remove, name='comment_remove'),
] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
view.py文件
@login_required
def post_new(request):
if request.method == "POST":
form = PostForm(request.POST)
if form.is_valid():
post = form.save()
post.author = request.user
post.published_date = timezone.now()
post.save()
return redirect('blog.views.post_detail', slug=post.slug)
else:
form = PostForm()
return render(request, 'blog/post_new.html', {'form': form})
说是"post_detail"报错,所以这里是
def post_detail(request, slug):
post = get_object_or_404(Post, slug=slug)
return render(request, 'blog/post_detail.html', {'post': post})
我错过了什么?
这是因为 new
匹配正则表达式 [-_\w]+
。
您必须重新排序 url 模式中的 url 个条目
改变这个:
url(r'^post/(?P<slug>[-_\w]+)/$', views.post_detail),
url(r'^post/new/$', views.post_new, name='post_new'),
有了这个:
url(r'^post/new/$', views.post_new, name='post_new'),
url(r'^post/(?P<slug>[-_\w]+)/$', views.post_detail),
解释:
代码中的 post_detail
url 条目在 post_new
url 之前计算。这使 post_detail
优先于 post_new
。
因为 post_detail
url 是 /post/
+ 任何匹配 [-_\w]+
和 new
匹配正则表达式的东西,Django 认为您将 new
作为 slug
传递给 post_detail
视图,并将其作为关键字参数传递给视图。由于没有 post 和 new
作为 slug,视图 returns 404 Not found
.
当 post_new
高于 post_detail
时,/post/new/
指向 post_new
视图并且 /post/
+ 任何具有正则表达式匹配的内容指向 post_detal
.