(三)理解模版 Template
上一章中,我们学会了如何实现视图,并将其接入路由配置中,使其能够被用户访问
接下来,我们将实现一个 Django 模板作为网页前端,从而给用户呈现更丰富的内容
Django 模板语言基础
Django 模板本质上是一个 HTML 文档,只不过通过一些特殊的语法实现数据的填充
表达式插值
最常用的语法,没有之一。通过在一对花括号 {{}} 放入一个表达式,就能够在视图中传入表达式中变量的内容,并最终渲染成包含变量具体内容的 HTML 代码。需要注意的是,所支持的表达式仅支持以下形式(可以自由组合):
<!-- 单个变量 -->
{{ variable }}
<!-- 获取字典的键或对象的属性 -->
{{ dict.key }}
{{ object.attribute }}
<!-- 获取列表中的某个元素 -->
{{ list.0 }}
eg:
<h1>{{ name }}</h1>
<p>{{ news.title }}</p>
<p>{{ news.visitors.0 }}</p>
如果我们在视图中传入以下上下文字典(Context Dictionary):
{
'name': 'Tuture',
'news': {
'title': 'Hello World',
'visitors': ['Tom', 'Marc'],
}
}
那么最终渲染成的 HTML 代码就是:
<h1>Tuture</h1>
<p>Hello World</p>
<p>Tom</p>
条件语句
顾名思义,有条件的语句,定义如下
{% if is_true %}
<h1>It is true!</h1>
{% else %}
<h1>It is false!</h1>
{% endif %}
如果变量 is_true 为真那么最终渲染出来的就是 <h1>It is true!</h1>,否则就是 <h1>It is false!</h1>,整个条件语句必须以 {% endif %} 结束,并且 {% else %} 是可选的
循环语句
循环语句用来在模板上展示任意长的列表内容
{% for elem in some_list %}
<p>{{ elem }}</p>
{% endfor %}
如果传入的 some_list 为 ['Apple', 'Banana', 'Orange'],那么渲染出的 HTML 代码就是:
<p>Apple</p>
<p>Banana</p>
<p>Orange</p>
实现一个 Django 模板
在 news 目录中创建一个 templates 目录,再在 templates 目录中创建一个 news 目录,并在内层的 news 目录中创建 index.html 文件

这是由于 Django 的模板查找机制 会将所有应用里面的模板全部收集到一起,如果两个模板的名字冲突,就会导致其中一个模板不能被正确访问。如果放在 news 子文件夹里面,就能够通过 news/index.html 访问,通过命名空间的机制避免冲突 内容如下:
{% if news_list %}
<ul>
{% for elem in news_list %}
<li>
<h3>{{ elem.title }}</h3>
<p>{{ elem.content }}</p>
</li>
{% endfor %}
</ul>
{% else %}
<p>暂无新闻</p>
{% endif %}
刚好覆盖了上述的三种模板语法:表达式插值、条件语句和循环语句
完成模板编写后,我们需要在视图中对其进行渲染,打开 news/views.py 文件,修改代码:
from django.shortcuts import render
def index(request):
context = {
'news_list': [
{
"title": "Raymq.com是个博客",
"content": "一个作者倾尽心血的博客",
},
{
"title": "Raymq.com 的专栏很棒",
"content": "有很多知识可以去学习",
},
]
}
return render(request, 'news/index.html', context=context)
这里我们调用 django.shortcuts.render 函数来渲染模板,这个函数通常接受三个参数(有其他参数,但是这里我们不关心):
- request:请求对象,直接把视图的参数 request 传进来就可以
- template_name:模板名称,这里就是我们刚刚创建的 news/index.html
- context:传入模板的上下文对象,必须是一个字典,字典中的每个键对应模板中的变量,这里我们弄了些假数据,假装是从数据库里面取来的、
继续访问 localhost:8000,看一下我们的首页内容:

总结
这一章我们主要讲了模板怎么建立的,以及如何在视图渲染
愿诸君顺遂