五、模板层
一、模板语法的书写格式
a. 变量相关
{{ }}
b. 逻辑相关
{% %}
二、模板语法的传值
1. 给html页面传值的两种方式
a. 指定值
return render(request, 'test.html', {'name': 'byx'})
b. locals(),传递当前名称空间中所有名字
return render(request, 'test.html', locals())
2. 值的数据类型
a. 支持所有python基本数据类型
b. 只要是能加括号调用的,html会自动加括号调用(函数、对象.方法)
c. 传函数名时,会展示函数返回值。
d. 直接传对象,显示的是对象的地址
三、模板语法的取值
模板语法取值统一采用句点符
1. 点名字
<p>{{ user_dict.name }}</p>
2. 点索引
<p>{{ user_list.2 }}</p>
3. 链式取值
<p>{{ user_dict.info.detail_info.2 }}</p>
4. 给数据起别名
别名只能在with内部使用
{{% with user_dict.info.detail_info.2 as asset %}}
<p>{{ asset }}</p>
{{% endwith %}}
四、模板语法之过滤器
1. 统计长度
无法统计默认返回0
<p>统计长度:{{ s|length }}</p>
2. 加法运算
数字相加或字符串拼接,不符合时返回空
<p>加法运算:{{ n|add:10 }}</p>
<p>加法运算:{{ s|add:'byx' }}</p>
3. 切片操作
顾头不顾尾
<p>切片操作:{{ l|slice:'0:5:2' }}</p>
4. 转成文件大小格式
<p>文件大小:{{ file_size|filesizeformat }}</p>
5. 截取文本内容
a. 按字符截取,截取17个字符加上‘...’
<p>截取文本内容:{{ text|truncatechars:20 }}</p>
b. 按空格截取文本
<p>截取文本内容:{{ text|truncatewords:20 }}</p>
6. 判断是否有值
有值展示值,没值展示默认值
<p>判断是否有值:{{is_value|default:'没接收到值'}}</p>
7. 展示带有标签的文本
a. 除非前后端转义,不会转成html标签
h = '<script>alert(123)</script>'
<p>展示带有标签的文本:{{ h }}</p>
b. 前端转义
<p>展示带有标签的文本:{{ h|safe }}</p>
c. 后端转义
from django.utils.safestring import mark_safe
h = '<script>alert(123)</script>'
h = mark_safe(h)
五、模板语法之标签
1. for循环
a. 基本语法
{% for foo in x %}
<p>{{ forloop }}</p>
<p>{{ foo }}</p>
{% endfor %}
b. forloop参数
forloop.first # 是否是第一个
forloop.last # 是否是最后一个
forloop.counter # 从1开始计数所在序号
forloop.counter0 # 从0开始计数所在序号
c. 当接收的对象为空时执行{% empty %}
{% empty %}
<p>现在打印我这句话</p>
2. if判断
基本语法
{% if s %}
<p>s有值</p>
{% else %}
<p>s没有值</p>
{% endif %}
3. for循环if判断结合示例
{% for foo in l %}
{% if forloop.first %}
<p>这是第一条数据</p>
{% if forloop.last %}
<p>这是最后一条数据</p>
{% else %}
<p>{{ foo }}</p>
{% endif %}
{% endfor %}
六、自定义过滤器、标签和inclusion_tag
1. 前置步骤
a. 在应用名下新建一个名字为templatetags的文件夹
b. 在该文件夹内,新建一个py文件
c. 在该py文件中写下下面代码
from django.template import Library
register = Library()
2. 自定义过滤器
只能有2个参数
a. py文件中编写
@register.filter(name='tag1')
def index(a, b):
return a + b
b. html页面中使用
{% load mytag %}..0
<p>{{ 2|tag1:3 }}</p>
p.s 自定义的过滤器可以在逻辑语句中使用,自定义标签不行
{% load mytag %}
{% if s %}
<p>s有值</p>
{% else %}
<p>s没有值</p>
{% endif %}
3. 自定义标签
能有多个参数,参数之间空格隔开
a. py文件中编写
@register.simple_tag(name='tag2')
def index(a, b, c, d):
return '%s%s%s%s' %(a, b, c, d)
b. html页面中使用
{% load mytag %}
{% tag2 '1' '2' '3' '4' %}
4. 自定义inclusion_tag
将传入的参数传给第三方html页面渲染,显示到当前html页面。当你使用一些页面组件,并且该页面组件需要参数才能正常渲染时使用。
a. py文件中编写
@register.inclusion_tag('mytag.html', name='tag3')
def index(n):
l = []
for i in range(n):
l.append('第%s项' %i)
return locals()
b. 第三方html页面
<ul>
{% for foo in l %}
<li>{{ foo }}</li>
{% endfor %}
</ul>
c. html页面
{% load mytag %}
{% tag3 10 %}
七、模板的继承
1. 继承方法
a. 在原页面(home.html)上划定更改区域
{% block myContent %}
<div class="jumbotron"...>
{% endblock %}
b. 新页面
{% extends 'home.html' %}
{% block myContent %}
自己修改的内容
{% endblock %}
2. 可以用block.super沿用父类方法(可多次沿用)
{% extends 'home.html' %}
{% block myContent %}
{{ block.super }}
{{ block.super }}
{% endblock %}
3. 通常一个模板页面包含三个区域:css区域、js区域和html区域。
八、模板的导入
1. 作用
将html页面当做模块直接导入使用
2. 代码
{% extends 'home.html' %}
{% block myContent %}
{{ block.super }}
{{ block.super }}
{% include 'form.html' %}
{% endblock %}