关于本站
1、基于Django+Bootstrap开发
2、主要发表本人的技术原创博客
3、本站于 2015-12-01 开始建站
今天没什么事做,来回查看我之前写的博文。查看的过程中发现想看下一篇博文得回到博客列表,再点击对应的博文。有点麻烦,准备给博文中添加上一篇和下一篇博文的链接。先交代一些东西,打开具体博客的Url设置如下:
url(r'^(?P<id>\d+)$', 'blog.views.blog_show', name='detailblog')
打开具体某一篇博客需要知道该博客的唯一信息。通常是该博客的主键id字段。
在url设置中,参数设置包含在括号中,例如 (?P<参数名>参数正则表达式)。由于id是数字所以正则表达式匹配至少一个数字即可。
响应方法再指向blog_show方法(待会会修改该方法)。具体url路由设置根据具体情况设置即可。
添加这两个链接得先得到这两个博文记录。若不熟悉Django的QuerySet查询,我们可以先使用SQL查询。Django中的模型是可以支持原始SQL查询的。例如 Blog.objects.raw("具体的SQL语句"),可以得到一个RawQuerySet对象。
修改博客应用Views.py文件的响应打开具体博客的方法代码:
#coding:utf-8 from .models import Blog #打开具体博客的响应方法,该方法有个参数,可见文底的Url设置 def blog_show(request, id): """show the blog centent""" try: data = {} #data用于向模板传递数据 blog = Blog.objects.get(id=id) #获取正被打开的博客 data['blog'] = blog #previous blog(上一篇) sql ="select * from blog_blog where id>%s order by id limit 1" % (id) pre_blogs = Blog.objects.raw(sql) if len(list(pre_blogs))>0: pre_blog = pre_blogs[0] else: pre_blog = None #next blog(下一篇) sql="select * from blog_blog where id<%s order by id desc limit 1" % (id) next_blogs = Blog.objects.raw(sql) if len(list(next_blogs))>0: next_blog = next_blogs[0] else: next_blog = None data['pre_blog'] = pre_blog data['next_blog'] = next_blog except Blog.DoesNotExist: raise Http404 return render_to_response("blog/blog_single.html", data, context_instance=RequestContext(request))
blog_show 是打开具体博文的响应方法。Url设置将会传递博客id信息,在响应方法的参数中写一个同名的参数即可。
利用id字段得到最近的一条记录。例如得到上一条博客,由于我的博客列表是降序排列的。id值大的排在前面,所以上一条博客应该是id值比当前博客大。采用条件 id>%s。 %s 是字符替换。Python基础不熟可以看看廖雪峰Python2.7教程。得到记录集之后判断是否有记录,有则返回第一条;没有,则返回空或Null。
再提供QuerySet的写法,毕竟SQL查询可读性不强。获取上一篇和下一篇的博客代码修改如下:
blog=Blog.objects.get(id=id) #当前打开的博客 pre_blog = Blog.objects.filter(id__gt=blog.id).order_by('id') next_blog = Blog.objects.filter(id__lt=blog.id).order_by('-id') #取第1条记录 if pre_blog.count() > 0: pre_blog = pre_blog[0] else: pre_blog = None if next_blog.count() > 0: next_blog = next_blog[0] else: next_blog = None
其中,__gt和__lt分别是大于和小于的意思。可以修饰到判断条件的字段上,有关Django的QuerySet查询可参考专题:http://yshblog.com/subject/6。
接着再取第一条记录即可。
有了数据,还需要修改模版文件,显示内容。修改显示具体博文模版文件如下:
<p> {% if pre_blog %} <a href="{%url 'detailblog' pre_blog.id%}">上一篇:{{pre_blog.caption}}</a> {% else %} 上一篇:没有了 {% endif %} </p> <p> {% if next_blog %} <a href="{%url 'detailblog' next_blog.id%}">下一篇:{{next_blog.caption}}</a> {% else %} 下一篇:没有了 {% endif %} </p>
这里if判断是判断是否为None,为None就不添加链接并显示提示“没有了”。
其中,detailblog是对博客文章具体链接解析(开篇就提到该设置)。上一篇文章和下一篇博客点开还是具体的博客内容。
保存更新一下,就可以显示结果。加了上一篇和下一篇感觉好多了。
黑色的忧虑2011
学习了!哇咔咔~
2017-10-16 16:12 回复