Django模板
Django模板是MVC架构中的视图层(view),模板文件通常保存在ProjectDir下的templates目录下,以.html的格式存储。
模板视图函数作为控制器,将用户请求被处理后映射到相应视图并返回HttpResponse。
模板文件可以直接书写html代码以及脚本代码块,模板渲染引擎会将脚本渲染为html元素。
模板中除了html注释<!-- -->
外,还有模板注释{# #}
.html注释将会随HttpResponse返回客户端,而模板注释不会包含在HttpResponse中.
在views函数中调用render(request, template_name, context)
函数渲染模板, 其中context为指定模板上下文的字典.
在模板中使用变量
在模板使用双花括号"{{ }}"使用变量,变量将从context中取出并转换为字符串替换变量元素。如:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Hello</title>
</head>
<body>
<p>{{ hello }}</p>
</body>
</html>
模板中的脚本元素
模板中的脚本元素有3种:
if/elif/else/endif
语法:
{% if condition1 %}
display 1
{% elif condiiton2 %}
display 2
{% else %}
display 3
{% endif %}
根据条件来判断显示的内容,可以使用and,or和not运算符,变量将从上下文中寻找。
for
for允许迭代某一对象,模板引擎将会渲染其中的内容
{% for item in iterable %}
<p>{{ item }}</p>
{% endfor %}
示例:
{% for item in a_list %}
<p>{{ item }}</p>
{% endfor %}
a_list必须从context中搜索,模板引擎不支持定义iterable。下列示例将产生语法错误:
{% for item in ['1','2'] %}
<p>{{ item }}</p>
{% endfor %}
支持reversed关键字和嵌套使用:
{% for item in iterable reversed %}
ifequal/ifnotequal
类似{%if%}标签,但可方便的进行比较:
{% ifequal obj1 obj2 %}
display 1
{% else %}
display 3
{% endifequal %}
等价于:
{% if obj1 == obj2 %}
display 1
{% else %}
display 2
{% endif %}
类似地,有ifnotequal:
{% ifnotequal obj1 obj2 %}
display 1
{% else %}
display 2
{% endifnotequal %}
管道过滤器
管道过滤器将上一个输出作为下一个过滤器的输入,通常最初的输出流是一个上下文中的对象:
{{ a_list|first|upper }}
上述示例中first
过滤器首先取出a_list的首元素,然后由upper
过滤器将其转化为大写。
include模板
{% include 'included.html' %}
标签允许在模板中包含其它的模板的内容。
模板继承
模板可以通过继承来实现复用。首先编写base.html
<html>
<head>
<title>Hello World!</title>
</head>
<body>
{% block mainbody %}
<p>base</p>
{% endblock %}
</body>
</html>
{% block %}
标签通知模板引擎,子模板可以重写这些部分。
{% extends "base.html" %}
{% block mainbody %}
<p>extends base</p>
{% endblock %}