首页 > 解决方案 > 找不到 Django 404 页面 blog.views.post_detail

问题描述

我是 django 的新手,我使用 mysql。我按照教程用 django 制作博客。我制作了列表和详细博客,但是当我单击博客的详细帖子时,错误出现 Page Not Found (404) Raised by: blog.views.post_detail。这些是我的网站 urls.py、博客 urls.py、models.py 和 views.py。

网站 urls.py:

from django.conf.urls import include, url
from django.contrib import admin

urlpatterns = [
    url(r'^admin/', include(admin.site.urls)),
    url(r'^blog/', include('blog.urls',
                            namespace='blog',
                            app_name='blog')),
] 

博客网址.py:

from django.conf.urls import url,include
from . import views

urlpatterns = [
    url(r'^$', views.PostListView.as_view(),name='post_list'),
    url(r'^(?P<year>\d{4})/(?P<month>\d{2})/(?P<day>\d{2})/'\
        r'(?P<post>[-\w]+)/$',
        views.post_detail,
        name='post_detail'),
]

模型.py:

# -*- coding: utf-8 -*-
from __future__ import unicode_literals
from django.db import models
from django.utils import timezone
from django.contrib.auth.models import User
from django.core.urlresolvers import reverse

class PublishedManager(models.Manager):
    def get_queryset(self):
        return super(PublishedManager,self).get_queryset()\
            .filter(status='published')
class Post(models.Model):
    STATUS_CHOICES = (('draft', 'Draft'), ('published', 'Published'),)
    title = models.CharField(max_length=250)
    slug = models.SlugField(max_length=250,unique_for_date='publish')
    author = models.ForeignKey(User,related_name='blog_posts')
    body = models.TextField()
    publish = models.DateTimeField(default=timezone.now)
    created = models.DateTimeField(auto_now_add=True)
    updated = models.DateTimeField(auto_now=True)
    status = models.CharField(max_length=10,choices=STATUS_CHOICES,default='draft')
    objects = models.Manager()
    published = PublishedManager()

    class Meta:
        ordering=('-publish',)

    def __str__(self):
        return self.title

    def get_absolute_url(self):
        return reverse('blog:post_detail',
        args=[self.publish.year,
             self.publish.strftime('%m'),
             self.publish.strftime('%d'),
             self.slug])

视图.py:

# -*- coding: utf-8 -*-
from __future__ import unicode_literals
from django.shortcuts import render,get_object_or_404
from .models import Post
from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger
from django.views.generic import ListView
def post_list(request):
    object_list = Post.published.all()
    paginator = Paginator(object_list,3)
    page = request.GET.get('page')
    try:
        posts = paginator.page(page)
    except PageNotAnInteger:
        posts = paginator.page(1)
    except EmptyPage:
        posts = paginator.page(paginator.num_pages)
    return render(request,'blog/post/list.html',{'page':page,'posts':posts})

class PostListView(ListView):
    queryset = Post.published.all()
    context_object_name = 'posts'
    paginate_by = 3
    template_name = 'blog/post/list.html'

def post_detail(request,year,month,day,post):
    post = get_object_or_404(Post,slug=post,
                                  status='published',
                                  publish__year=year,
                                  publish__month=month,
                                  publish__day=day)
    return render (request,
                    'blog/post/detail.html',
                    {'post':post})

标签: pythondjangopython-3.xweb

解决方案


我认为也许您应该使用“pk”作为参数,而不是您拥有的复杂网址

def post_detail(request, pk):
    post = get_object_or_404(Post,pk=pk)
    return render (request,
                'blog/post/detail.html',
                {'post':post})

urlpatterns = [
    url(r'^$', views.PostListView.as_view(),name='post_list'),
    url(r'^(?P<pk>[0-9]+)/$',
        views.post_detail,
        name='post_detail'),
        ]

只是不要把没有人喜欢的事情复杂化

如果你仍然希望它成为你的方式,试着从一开始就让它变得超级简单,然后添加你的东西,看看到底出了什么问题。

从一开始就使用 id,然后尝试添加一年,然后是一个月,然后是其他东西。你会发现哪里不对


推荐阅读