目前我们看到的只是模板中预先填充的一些数据,我们得让它显示从数据库中获取的文章数据。下面来稍微改造一下模板:
在模板 index.html 中你会找到一系列 article 标签:
templates/blog/index.html ... <article> ... </article> <article> ... </article> <article> ... </article> ...这里面包裹的内容显示的就是文章数据了。我们前面在视图函数 index 里给模板传了一个 post_list 变量,它里面包含着从数据库中取出的文章列表数据。就像 Python 一样,我们可以在模板中循环这个列表,把文章一篇篇循环出来,然后一篇篇显示文章的数据。要在模板中使用循环,需要使用到前面提到的模板标签,这次使用 {% for %} 模板标签。将 index.html 中多余的 article 标签删掉,只留下一个 article 标签,然后写上下列代码:
templates/blog/index.html ... {% for post in post_list %} <article> ... </article> {% empty %} <div>暂时还没有发布的文章!</div> {% endfor %} ...可以看到语法和 Python 的 for 循环类似,只是被 {% %} 这样一个模板标签符号包裹着。{% empty %} 的作用是当 post_list 为空,即数据库里没有文章时显示 {% empty %} 下面的内容,最后我们用 {% endfor %} 告诉 django 循环在这里结束了。
你可能不太理解模板中的 post 和 post_list 是什么。post_list 是一个 QuerySet(类似于一个列表的数据结构),其中每一项都是之前定义在 blog\models.py 中的 Post 类的实例,且每个实例分别对应着数据库中每篇文章的记录。因此我们循环遍历 post_list ,每一次遍历的结果都保存在 post 变量里。所以我们使用模板变量来显示 post 的属性值。例如这里的 {{ post.pk }}(pk 是 primary key 的缩写,即 post 对应于数据库中记录的 id 值,该属性尽管我们没有显示定义,但是 django 会自动为我们添加)。
现在我们可以在循环体内通过 post 变量访问单篇文章的数据了。分析 article 标签里面的 HTML 内容,h1 显示的是文章的标题,
<h1> <a href="http://www.likecs.com/single.html">Adaptive Vs. Responsive Layouts And Optimal Text Readability</a> </h1>我们把标题替换成 post 的 title 属性值。注意要把它包裹在模板变量里,因为它最终要被替换成实际的 title 值。
<h1> <a href="http://www.likecs.com/single.html">{{ post.title }}</a> </h1>下面这 5 个 span 标签里分别显示了分类(category)、文章发布时间、文章作者、评论数、阅读量。
<div> <span><a href="#">django 博客教程</a></span> <span><a href="#"><time datetime="2012-11-09T23:15:57+00:00">2017年5月11日</time></a></span> <span><a href="#">追梦人物</a></span> <span><a href="#">4 评论</a></span> <span><a href="#">588 阅读</a></span> </div>再次替换掉一些数据,由于评论数和阅读量暂时没法替换,因此先留着,我们在之后实现了这些功能后再来修改它,目前只替换分类、文章发布时间、文章作者:
<div> <span><a href="#">{{ post.category.name }}</a></span> <span><a href="#"><time datetime="{{ post.created_time }}">{{ post.created_time }}</time></a></span> <span><a href="#">{{ post.author }}</a></span> <span><a href="#">4 评论</a></span> <span><a href="#">588 阅读</a></span> </div>这里 p 标签里显示的是摘要
<div> <p>免费、中文、零基础,完整的项目,基于最新版 django 1.10 和 Python 3.5。带你从零开始一步步开发属于自己的博客网站,帮助你以最快的速度掌握 django 开发的技巧...</p> <div> <a href="#">继续阅读 <span>→</span></a> </div> </div>替换成 post 的摘要:
<div> <p>{{ post.excerpt }}</p> <div> <a href="#">继续阅读 <span>→</span></a> </div> </div>再次访问首页,它显示:暂时还没有发布的文章!好吧,做了这么多工作,但是数据库中其实还没有任何数据呀!接下来我们就实际写几篇文章保存到数据库里,看看显示的效果究竟如何。