当前分类:python>>正文

django博客系统用first()和last()实现

来源:6yhj   时间:2022年6月29日   编辑

我的乐酷网内容管理系统之前的功能,使用的其他方法实现的,做的一个遍历,虽然没什么问题,今天突然看到别人分享的first()和last()两个方法,我觉得用来实现的功能,又更简单快速一些。

而且要少一个路由,决定把我原来的实现功能优化一下。

原本40多行代码实现的,现在只有20来行代码

来看下views.py

def post(request,id):
    postid=int(id)
    if request.method=='GET':
        try:
            post=Posts.objects.get(id=postid)            
            nextpost=Posts.objects.filter(id__gt=postid).first()
            prepost=Posts.objects.filter(id__lt=post.id).last()
            context = {
                'post': post,
                'title':'正文',
                'next':nextpost,
                'previous':prepost,
                'related': related(postid),
                'new':Posts.objects.all().order_by('-id')[:5],
                'hot':Posts.objects.all().order_by('-views')[:5],
            }
            return render(request, 'content.html', context=context)
        except Exception as e:
            raise Http404('出错啦!您访问的这个页面进入云端消失了!')

简单解释一下。

postid是当前文章id

下面这句是返回文章

nextpost=Posts.objects.filter(id__gt=postid).first()

id__gt=postod表示比当前文章id要大,那么接下来的第一篇就是了

同理

prepost=Posts.objects.filter(id__lt=post.id).last()

id__lt=post表示比当前文章id小,那么比当前id小的文章中的最后一篇就是前一篇了

还是比较好理解的。

然后再看下前端模板的写法:

<div class="fl">
     {%if previous%}
        [:<a href="/leku-p-{{previous.id}}.html" >{{previous.title}}</a>]
    {%else%}[:没有啦!]
    {%endif%}
    </div>
        <div class="fr">
             {%if next%}
         [:<a href="/leku-p-{{next.id}}.html" >{{next.title}}</a>]
            {%else%}[:没有啦!]
    {%endif%}
        </div>
<div class="cl"></div>

 

first()以及last()在有结果的情况下会返回一个objects对象,如果没有结果就会返回None

这时候可用一个if语句判断一下,如果有则给出的超链接,如果没有则返回文本,提醒没有上下文。

[猜你喜欢]

标签: django 博客程序