学习资料
《Django Web应用开发实战》
1. Django模板引擎
Django内置的模板引擎包含模板上下文(也可以说是模板变量)、标签、过滤器
- 模板上下文:以变量的形式写入模板文件里面,变量值由视图函数或视图类传递所得
- 标签:对模板上下文进行控制输出,比如模板上下文的判断和循环控制等
- 模板继承:隶属于标签,它是将每个模板文件重复的代码抽取出来并写在一个共用的模板文件中,其他模板文件通过继承共用模板文件来实现完整的网页输出
- 过滤器:对模板上下文进行操作处理,比如模板上下文的内容截取,替换或格式转换等
2. 模板上下文
模板上下文是模板中基本的组成单位,上下文的数据由视图类传递,它以{{ variable }}表示, variable是上下文的名称,支持Python所有的数据类型
# variablel = '字符串或整型'
<div>{{ variable }}</div>
# 输出 <div>字符串或整型</div>
# 假如 variable2 = {'name': '字典或实例化对象'}
<div>{{ variable2.name }}</div>
# 输出 <div>字典或实例化对象</div>
# 假如variable3 = ['元组或列表'], 0为下标
<div>{{ variable3.0 }}</div>
# 输出 <div>元组或列表</div>
# 如果属性不存在django默认显示空
3. 内置标签
标签是对模板上下文进行控制输出,它是以{% tag %}表示的,其中tag是标签的名称,Django内置了许多模板标签,比如{% if %} - 判断标签、{% for %} - 循环标签, {% url %} - 路由标签等
常用内置标签
标签 | 描述 |
---|---|
{% for %} | 遍历输出上下文的内容 |
{% if %} | 对上下文进行条件判断 |
{% csrf_token %} | 生成csrf_token的标签,用于防护跨站请求伪造攻击 |
{% url %} | 引用路由的配置地址,生成相应的路由地址 |
{% with %} | 将上下文重新命名 |
{% load %} | 加载导入Django的标签库 |
{% static %} | 读取静态资源的文件内容 |
{% extends xxx %} | 模板继承,xxx为模板文件名,使当前模板继承xxx模板 |
{% block xxx %} | 重写父类模板的代码 |
# for 标签,支持嵌套,myList可为列表,元组或某个对象
{% for item in myList %}
{{ item }}
# endfor 结束循环
{% endfor %}
# if 标签,支持嵌套
# 判断条件符与上下文之间使用空格隔开, 否则程序会抛出异常
# {% endif %}与{% endfor %}的作用是相同的
{% if name == "Lily" %}
{{ name }}
{% elif name == "Lucy" %}
{{ name }}
{% else %}
{{ name }}
{% endif %}
# url标签
# 生成不带变量的url地址
<a href="{% url 'index' %}">首页</a>
# 生成变量的url地址
<a href="{% url 'page' 1%}">第一页</a>
# with标签:与Python的with语法的功能相同
{% with total=number%}
{{ total }}
{% endwith %}
# load标签,导入静态文件标签库staticfiles
# staticfiles来自settings.py 的 INSTALLED_APPS
{% load staticfiles %}
{% static "css/index.css" %}
for标签中,模板还提供了一些特殊的变量来获取for标签的循环信息
变量 | 描述 |
---|---|
forloop.counter | 获取当前循环的索引,从1开始计算 |
forloop.counter() | 获取当前循环的索引,从0开始计算 |
forloop.revcounter | 索引从最大数开始递减,直到索引到1位置 |
forloop.revcounter() | 索引从最大数开始递减,直到索引到0位置 |
forloop.first | 当遍历的元素第一项时为真 |
forloop.last | 当遍历的元素最后一项时为真 |
forloop.parentloop | 在嵌套的for循环中,获取上层for循环的forloop |
forloop对象是在模板引擎解析for标签时生成的
{% for name in name_list %}
{% if forloop.counter == 1 %}
<span>这次第一次循环</span>
{% elifforloop.last %}
<span>这是最后依次循环</span>
{% else %}
<span>本次循环次数为: {{ forloop.counter }}</span>
{% endif %}
{% endfor %}
4. 模板继承
模板继承时通过模板标签来实现的,是将多个模板文件的共同代码集中在一个新的模板文件中,其他文件直接调用新的模板文件,来生成html网页,减少重复代码
{# base.html 基类模板#}
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
{% block title %}
<title>首页</title>
{% endblock %}
</head>
<body>
{% block body %}
{% endblock %}
</body>
</html>
{# index.html 继承并重写base部分代码#}
{% extends "base.html" %}
{# 重写base.html 中 body#}
{% block body %}
<a href="{% url 'index' %}">首页</a>
<h1>Hello Django</h1>
{% endblock %}
5. 内置过滤器
过滤器是对上下文的内容进行操作处理,如替换、反序、和转义等,通过过滤器来转换我们想要的显示效果,可以减少视图的代码量
使用方法
{# variable 是模板上下文, filter是过滤器1 lower是过滤器2#}
{{ variable | filter | lower}}
{# 带参数的过滤器 #}
{{ variable | date:"D d M Y"}}
这里只列出个人觉得用的比较多的内置过滤器
内置过滤器 | 使用形式 | 说明 |
---|---|---|
add | {{ value | add:"2" }} | value = value + 2 |
date | {{ value | date:"D d M y"}} | 按照指定格式输出时间 |
default | {{ value | default:"nothing"}} | 如果value为False,则输出nothing |
length | {{ value | length}} | 返回value的长度 |
random | {{ value | random}} | 从value列表中随机返回一个item |
safe | {{value | safe}} | 关闭html转义,告诉django这段代码是安全的 |
slice | {{value | slice:":2"}} | 从value中切片,截取前两个字符,与Python中切片一致 |
timenutil | {{value | timenutil}} | 返回value距离当前日期的天数和小时数 |