Django框架之模板
Django框架之模板层
什么是模板
需要返回给浏览器的html文件
Django的模板 = HTML代码 + 模板语言
模板语言
有与我们直接返回html页面的话,那他只是一个静态页面无法实现前后端数据交互,那么我们就需要经过页面渲染,让静态文件呈现出动态页面的效果。
模板语言的变量
如果我们需要将后端的数据传递到前端页面渲染,就需要用到模板语言中的变量
用法:通过{{}}
来获取后端传递过来的数据
变量支持的数据类型:
- int
- float
- str
- dict
- list
- tuple
- set
- bool
- function
- class
注:所有的数据类型只支持点取值,并且函数的值时函数的返回值并且不支持函数传值,类显示的是类的内存地址。
模板语言的过滤器
用来把视图传入的变量值加以修饰后再显示{{ 变量名|过滤器名:传递给过滤器的参数 }}
常用过滤器
# default
# 如果一个变量值是False或者为空,使用default后指定的默认值,否则,使用变量本身的值,如果value=''则输出默认的内容
{{ value|default:"默认内容" }}
# length
# 返回值的长度。它对字符串、列表、字典等容器类型都起作用
{{ value|length }}
# filesizeformat
# 将值的格式化为一个"人类可读的"文件尺寸变量的默认单位是字节
{{ value|filesizeformat }}
# date
#作用:将日期按照指定的格式输出
{{ value|date:"指定格式" }}
# slice
# 对输出的字符串进行切片操作,顾头不顾尾
{{ value|slice:"0:2" }}
# truncatechars
# 显示指定的字符数量,如果大于指定数量,那么会被截断,截断的字符串将以省略号(“...”),并且省略号也占字符数量
{{ value|truncatechars:8 }}
# truncatewords
# 与truncatechars相同,但truncatewords是按照单词截断,末尾的3个点不算作单词
{{ value|truncatewords:2 }}
# safe
# 出于安全考虑,Django的模板会对HTML标签、JS等语法标签进行自动转义,交给浏览器后会被解析成普通字符,但如果我们就想让模板变量{{ value }}被渲染的结果有语法意义,那么就用到了过滤器safe
{{ value|safe }}
模板语法的标签
for标签
# 遍历每一个元素:
{% for li in lis %}
<p>{{ li }}</p>
{% endfor %}
# 可以利用{% for li in lis reversed %}反向循环。
# 遍历一个字典:
{% for key,val in dic.items %}
<p>{{ key }}:{{ val }}</p>
{% endfor %}
# 循环序号可以通过{{ forloop }}显示
forloop.counter 当前循环的索引值(从1开始)
forloop.counter0 当前循环的索引值(从0开始)
forloop.revcounter 当前循环的倒序索引值(从1开始)
forloop.revcounter0 当前循环的倒序索引值(从0开始)
forloop.first 当前循环是第一次循环则返回True,否则返回False
forloop.last 当前循环是最后一次循环则返回True,否则返回False
forloop.parentloop 本层循环的外层循环
# for标签可以带有一个可选的{% empty %} 从句,在变量person_list为空或者没有被找到时,则执行empty子句
{% for li in lis %}
<p>{{ li }}</p>
{% empty %}
<p>lis为空</p>
{% endfor %}
if标签
# 注意:
{% if 条件 %}条件为真时if的子句才会生效,条件也可以是一个变量,if会对变量进行求值,在变量值为空、或者视图没有为其传值的情况下均为False
# 语法
{% if num > 100 or num < 0 %}
<p>无效成绩</p>
{% elif num > 80 and num < 100 %}
<p>优秀</p>
{% else %}
<p>凑活吧</p>
{% endif %}
# if语句支持 and 、or、==、>、<、!=、<=、>=、in、not in、is、is not判断。
with标签
# with标签用来为一个复杂的变量名起别名,如果变量的值来自于数据库,在起别名后只需要使用别名即可,无需每次都向数据库发送请求来重新获取变量的值
{% with li.1.upper as v %}
{{ v }}
{% endwith %}
自定义过滤器和标签
前提:
-
在应用中创建templatetags(只能是这个名称)
-
在文件夹中建任意.py文件
-
在文件中添加两条语句
from django import template register = template.Library()
然后我们就能够自定义过滤器与标签了
自定义标签
@register.simple_tag
def my_multi_tag(v1, v2): # 自定义的标签可以定义多个参数
return v1 * v2
自定义过滤器
@register.filter
def my_multi_filter(v1 ,v2): # 自定义的过滤器只能定义最多两个参数
# 针对{{ value1 | 过滤器名称:value2 }},参数传递为v1=value1,v2=value2
return v1 * v2
模板的导入和继承
在一个模板文件中,引入或重用另外一个模板文件的内容
模板的导入
{% include '模版名称' %}
模板的继承
{% extends "模版名称" %}
# 也就是说include有的功能extends全都有,但是extends可以搭配一个block标签,用于在继承的基础上定制新的内容
如果要继承模板的内容并定制新内容需要在继承模板中定义定制区域(使用block标签)