Django blog 数据库的问题


我发现 如果在后台删除了某条post记录,

数据库的结构就会被打乱

然后最新的一篇post就会显示不出来

debug信息显示如下:

请问有谁知道这应该如何解决?

是我models.py 写的是出现问题了吗?

  • 3 条回复 | 2 人参与
  • 发完帖子我就找到原因了。

    是我ditail函数中 有一段找到上下文post的地方出现了问题

    由于需要找到上下文的object,所以才会导致查询失败。

    请问大家是如何实现这个功能的呢?

     def get_context_data(self, **kwargs):
            # 复写 get_contex_data 是为了除了将post传递给模板外(DetailView已经帮我们完成)
            # 还要讲我们自己写的其他数据传递给模板,如评论表单,上下文等
            context = super(PostDetailView, self).get_context_data(**kwargs)
    
            # 获取所有文章数量
            post_count = len(Post.objects.all())
            pk = self.object.pk
            # 获取上下文的
            if pk == 1:
                pre_post = {'title': '没有了',
                            'get_absolute_ul': '', }
            else:
                pre_post = get_object_or_404(Post, pk=int(pk) - 1)
    
            if pk == post_count:
                next_post = {'title': '没有了',
                             'get_absolute_ul': '', }
            else:
                next_post = get_object_or_404(Post, pk=int(pk) + 1)
    
            form = CommentForm()
            comment_list = self.object.comment_set.all()
            context.update({
                'form': form,
                'comment_list': comment_list,
                'pre_post': pre_post,
                'next_post': next_post,
            })
    
            return context
    
  • 这样做是不行的,因为数据库中文章的 id 不一定是连续的。如果你的文章是按照时间排序的话,有一个 get_previous_by_<时间 field 名>get_next_by_<时间 field 名> 方法获取早一篇和晚一篇的文章,下面是我博客的代码供你参考:

    def detail(request, pk):
        post = get_object_or_404(Post, pk=pk)
        post.increase_views()
        md = markdown.Markdown(extensions=[
            'markdown.extensions.extra',
            'markdown.extensions.codehilite',
            TocExtension(slugify=slugify)
        ])
        post.body = md.convert(post.body)
    
        # 获取上一篇
        # 要注意可能上一篇无存在,需要处理异常
        try:
            previous_post = post.get_previous_by_created_time()
        except Post.DoesNotExist:
            previous_post = None
    
        # 获取下一篇
        try:
            next_post = post.get_next_by_created_time()
        except Post.DoesNotExist:
            next_post = None
    
        return render(request, 'blog/detail.html', context={'post': post,
                                                            'toc': md.toc,
                                                            'previous_post': previous_post,
                                                            'next_post': next_post})
    
  • @追梦人物 的确是这样的,一开始自己处理的时候没有想到pk不是连续的,

    已经解决了

    谢谢指点了!

添加一条新回复
登录 或者 注册 后发表回复