【问题标题】:Page not found (404) - No Post matches the given query找不到页面 (404) - 没有与给定查询匹配的帖子
【发布时间】:2016-07-25 13:24:02
【问题描述】:

我正在开发一个 Django 博客,并为帖子标题实现了 slug,但我偶然发现了一个问题。
错误是

找不到页面 (404)
请求方法:GET
请求网址:http://localhost:8000/post/new/
提出者:blog.views.post_detail

没有帖子匹配给定的查询。

这是我的 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})

我错过了什么?

【问题讨论】:

    标签: django django-urls


    【解决方案1】:

    这是因为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 传递987654335@ 视图并将其作为关键字参数传递给视图。由于没有 new 作为 slug 的帖子,因此视图返回 404 Not found

    post_new 高于post_detail 时,/post/new/ 指向post_new 视图,/post/ + 任何带有正则表达式匹配点的东西都指向post_detal

    【讨论】:

    • 它有效(谢谢!),但我不确定我是否理解原因。
    猜你喜欢
    • 1970-01-01
    • 2018-09-22
    • 1970-01-01
    • 1970-01-01
    • 2021-09-13
    • 2019-12-23
    • 2021-09-18
    • 2019-07-21
    • 1970-01-01
    相关资源
    最近更新 更多