我的乐酷网内容管理系统之前的功能,使用的其他方法实现的,做的一个遍历,虽然没什么问题,今天突然看到别人分享的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语句判断一下,如果有则给出的超链接,如果没有则返回文本,提醒没有上下文。
标签: