我的网站搭建(第10天) 上一篇和下一篇

  • 发布时间:2015年12月19日 15:52
  • 作者:杨仕航
* 该文是基于Python2.7开发的,最新Python3.x和Django2.x视频教程可以前往 >> Django2.0视频教程

今天没什么事做,来回查看我之前写的博文。查看的过程中发现想看下一篇博文得回到博客列表,再点击对应的博文。有点麻烦,准备给博文中添加上一篇和下一篇博文的链接。先交代一些东西,打开具体博客的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是对博客文章具体链接解析(开篇就提到该设置)。上一篇文章和下一篇博客点开还是具体的博客内容。

保存更新一下,就可以显示结果。加了上一篇和下一篇感觉好多了。

上一篇:笔记本改装成双屏小主机

下一篇:Excel公式和vba根据日期获取中文星期几的方法

评论列表

黑色的忧虑2011

黑色的忧虑2011

学习了!哇咔咔~

2017-10-16 16:12 回复

新的评论

清空