【Flask学习】2.2模板之设计

1.变量

2.1节中的模板文件user.html的{{ name }}就是一个变量,形式如一种占位符,而真实的数据只有在程序临时的上下文中获取。

Jinja2能识别所有类型的变量,甚至一些复杂的类型,例如列表、字典和对象。示例如下:{{ mylist[1] }},{{ mydict[‘name’] }},{{ myobj.to_do() }}。
同时,Jinja2支持使用过滤器修改变量,过滤器添加在变量后面,中间用竖线分割,例如将变量name的首字母大写:
Hello, {{ name|capitalize }}

Jinja2提供的部分常用过滤器有:

过滤器说明
capitalize把值的首字母变成大写,其他字母变成小写
lower把字母全部变成小写
upper把字母全部变成大写
title把值中每个单词的首字母都变成大写
trim把值的首尾空格去掉
striptags渲染之前把值中所有的HTML标签都删掉
safe渲染时不转义

safe 过滤器值得特别说明一下。默认情况下,出于安全考虑,Jinja2 会转义所有变量。例如,如果一个变量的值为 ‘<h1>Hello, everyone.<h1>’,Jinja2 会将其渲染成 ‘&lt;h1&gt;Hello, everyone.&lt;/h1&gt;’ ,浏览器能显示这个 h1 元素,但不会进行解释。很多情况下需要显示变量中存储的 HTML 代码,这时就可使用 safe 过滤器。

2.控制结构

JInja2提供了多种控制结构,用来改变模板的渲染过程。
下面例如展示:条件控制

{% if user %}
	Hello, {{ user }}.
{% else %}
	Hello, stranger.
{% endif %}

下面例如展示:渲染一组元素

<ul>
	{% for comment in comments %}
		<li>{{ comment }}</li>
	{% endfor %}
</ul>

Jinja2还支持,宏类似于python中的函数:

!<-- 创建宏 -->
{% macro render_comment(comment) %}
	<li>{{ comment }}</li>
{% endmacro %}

<ul>
	{% for comment in comments %}
		!<-- 使用宏 -->
		{{ render_comment(comment) }}
	{% endfor %}
</ul>

为了重复使用宏,我们可以把它保存在单独的文件中,需要时再导入:

{% import 'macros.html' as macros %}

<ul>
	{% for comment in comments %}
		!<-- 使用宏 -->
		{{ macros.render_comment(comment) }}
	{% endfor %}
</ul>

在日常开发模板中,我们经常会使用到重复的代码。为了避免多份文件都有同样的代码片段,我们需要把重复使用的模板代码写入单独的文件,然后在需要的文件开头包含include:

{% include 'common.html' %}

解决重复使用代码的另一种方法是模板继承,它类似于python中的类继承。首先,我们要创建一个名为base.html的基模板:

<html>
<head>
	{% block head %}
	<title>{% block title %}{% endblock %} - My Application</title>
	{% endblock %}
</head>

<body>
	{% block body %}
	{% endblock %}
</body>
</html>

block标签定义的元素可在衍生模板中修改。在base.html中,定义了head、title和body的块,然后衍生模板index.html继承基模板base.html:

{% extends "base.html" %}

{% block title %}Index Page{% endblock %}
{% block head %}
	{{ super() }}
	<style>
	</style>
{% endblock %}

{% block body %}
	<h1>Hello, everyone.</h1>
{% endblock %}

extends指令声明这个模板衍生自base.html,而且基模板中的3个块被重新定义,模板引擎会将其插入合适的位置。注意:新定义的head块,因为基模板中block head内容不是空的,所以用super()获取原来的内容

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值