Django之模版层

模板语法之传值

Django提供的两种模板语法:

  • {{ 变量名}}:用于变量相关操作(引用)
  • {% 标签名 %}:用于逻辑相关操作(循环、判断)

传值的两种方式

指名道姓的传

  1. return render(request, 'index.html', {'name':name})

打包传值

  1. # locals() 将当前名称空间中所有的名字全部传递给`html`页面
  2. return render(request, 'index.html', locals())

传值的范围

  • 函数名:模板语法会自动加括号执行,并将函数的返回值展示到页面上不支持传参(模板语法会自动忽略有参函数)
  • 文件名:直接显示文件IO对象
  • 类名:自动加括号实例化成对象
  • 对象名:显示对象的地址,并且具有调用属性和方法的能力

传值使用

Django模板语法中针对容器类型的取值只有一种方式句点符,既可以点key,也可以点索引 Django内部自动识别

模板语法之内置过滤器

过滤器是把视图传入的变量值加以修饰后再显示

语法

  1. {{ 变量名|过滤器名:传给过滤器的参数 }} # 过滤器最多只能传输一个参数

常用内置过滤器

length

作用:统计数据的长度,对字符串、列表、字典等容器类型都起作用

  1. {{ value|length }}

add

作用:算术加法或者字符串加法

  1. {{ value|add:111 }}
  1. {{ value|add:'aaa'}}

filesizeformat

作用:将数字转成合适的文件计量单位

  1. {{ value|filesizeformat }}

default

作用:如果一个变量值是False或者为空,使用default后指定的默认值,否则,使用变量本身的值

  1. {{ value|default:"nothing" }}

date

作用:将日期按照指定的格式输出

  1. {{ value|date:'Y-m-d' }}

slice

作用:对输出的字符串进行切片操作,顾头不顾尾

  1. {{ value|slice:'0:10' }}

truncatewords

作用:按照空格截取指定个数的文本(不包含三个点)

  1. {{ value|truncatewords:3 }}

truncatechars

作用:按照字符个数截取文本(包含三个点)

  1. {{ value|truncatechars:6 }}

cut

作用:移除指定的字符

  1. {{ value|cut:'|' }}

safe

作用:出于安全考虑,Django的模板会对HTML标签、JS等语法标签进行自动转义,如果不想被转以使用safe

  1. {{ value|safe }}

后端也可以写好直接传入前段

  1. from django.util.safestring import make_safe
  2. t = '<script>alert(123)</script>'
  3. res = make_safe(t)

更多过滤器

过滤器 说明
add 加法
addslashes 添加斜杠
capfirst 首字母大写
center 文本居中
cut 切除字符
date 日期格式化
default 设置默认值
default_if_none 为None设置默认值
dictsort 字典排序
dictsortreversed 字典反向排序
divisibleby 整除判断
escape 转义
escapejs 转义js代码
filesizeformat 文件尺寸人性化显示
first 第一个元素
floatformat 浮点数格式化
force_escape 强制立刻转义
get_digit 获取数字
iriencode 转换IRI
join 字符列表链接
json_script 生成script标签,带json数据
last 最后一个
length 长度
length_is 长度等于
linebreaks 行转换
linebreaksbr 行转换
linenumbers 行号
ljust 左对齐
lower 小写
make_list 分割成字符列表
phone2numeric 电话号码
pluralize 复数形式
pprint 调试
random 随机获取
rjust 右对齐
safe 安全确认
safeseq 列表安全确认
slice 切片
slugify 转换成ASCII
stringformat 字符串格式化
striptags 去除HTML中的标签
time 时间格式化
timesince 从何时开始
timeuntil 到何时多久
title 所有单词首字母大写
truncatechars 截断字符
truncatechars_html 截断字符
truncatewords 截断单词
truncatewords_html 截断单词
unordered_list 无序列表
upper 大写
urlencode 转义url
urlize url转成可点击的链接
urlizetrunc urlize的截断方式
wordcount 单词计数
wordwrap 单词包裹
yesno 将True,False和None,映射成字符串‘yes’,‘no’,‘maybe’

为模版过滤器提供参数的方式是:过滤器后加个冒号,再紧跟参数,中间不能有空格!

模板语法之标签

if标签

对一个变量求值,如果它的值True这个内容块就会输出:

  1. {% if 条件1 %}
  2. <p>条件1成立,打印此消息</p>
  3. {% elif 条件2 %}
  4. <p>条件2成立,打印此消息</p>
  5. {% else %}
  6. <p>条件1、2都不成立,打印此消息</p>
  7. {% endif %}

补充:if语句支持 andor==><!=<=>=innot inisis not判断

for标签

循环对象中的每一个元素

  1. {% for i in l1 %}
  2. <p>{{ i }}</p>
  3. {% endfor %}

遍历一个字典

  1. {% for k,v in dic.item %}
  2. <p>{{ k }}:{{ v }}</p>
  3. {% endfor %}

循环序号可以通过{{ forloop }}显示

变量名 描述
forloop.counter 循环计数器,表示当前循环的索引(从 1 开始)。
forloop.counter0 循环计数器,表示当前循环的索引(从 0 开始)。
forloop.revcounter 反向循环计数器(以最后一次循环为 1,反向计数)。
forloop.revcounter0 反向循环计数器(以最后一次循环为 0,反向计数)。
forloop.first 当前循环为首个循环时,该变量为 True
forloop.last 当前循环为最后一个循环时,该变量为 True
forloop.parentloop 在嵌套循环中,指向当前循环的上级循环

当传递到 for 标签中的数组不存在或为空时,可以使用 {% empty %} 标签来指定输出的内容

  1. {% for i in l1 %}
  2. {% if forloop.first %}
  3. <p>这是第一次循环</p>
  4. {% elif forloop.last %}
  5. <p>这是最后一次循环</p>
  6. {% else %}
  7. <p>中间循环</p>
  8. {% endif %}
  9. {% empty %}
  10. <p>for循环对象为空 自动执行</p>
  11. {% endfor %}

更多标签

标签 说明
autoescape 自动转义开关
block 块引用
comment 注释
csrf_token CSRF令牌
cycle 循环对象的值
debug 调试模式
extends 继承模版
filter 过滤功能
firstof 输出第一个不为False的参数
for 循环对象
for … empty 带empty说明的循环
if 条件判断
ifchanged 如果有变化,则..
include 导入子模版的内容
load 加载标签和过滤器
lorem 生成无用的废话
now 当前时间
regroup 根据对象重组集合
resetcycle 重置循环
spaceless 去除空白
templatetag 转义模版标签符号
url 获取url字符串
verbatim 禁用模版引擎
widthratio 宽度比例
with 上下文变量管理器

使用文档:https://docs.djangoproject.com/zh-hans/4.0/ref/templates/builtins/

自定义过滤器与标签

  1. 在应用下需要创建一个名为templatetags的文件夹
  2. templatetags文件夹任意新建一个py文件,在该文件中自定义过滤器或标签
  3. 在该py文件内需要先提前编写两行固定的代码
  1. from django import template
  2. register = template.Library()

自定义过滤器

  1. # 自定义过滤器:最多只能接收两个参数
  2. @register.filter(is_safe=True)
  3. def index(a, b): // 参数传递为a=value,b=666
  4. return a + b
  1. {{% load my_tags %}} // 必须先加载自定义过滤器和标签的文件,一个html页面加载一次就可以了
  2. {{ value|index:666 }}

自定义标签

  1. # 自定义标签:可以接收任意的参数
  2. @register.simple_tag
  3. def func(a, b, c, d):
  4. return a + b + c + d
  1. {% func 1 2 3 4 %} // 参数之间空格隔开即可

可以指定name

  1. @register.simple_tag(name='my_tag')
  2. def func(a, b, c, d):
  3. return a + b + c + d
  1. {% my_tag 1 2 3 4 %}

自定义inclusion_tag

该方法需要先作用于一个局部html页面,之后将渲染的结果放到调用的位置

  1. # 自定义inclusion_tag
  2. @register.inclusion_tag('left.html')
  3. def func2(n):
  4. l1 = []
  5. for i in range(1, 1 + n):
  6. l1.append(f'第{i}页')
  7. return locals()
  1. // left.html
  2. <ul>
  3. {% for i in l1 %}
  4. <li>{{ i }}</li>
  5. {% endfor %}
  6. </ul>
  1. {% func2 10 %}

模板的导入

在一个模板文件中,“引入”另外一个模板文件的内容

语法

  1. {% include '模版名称' %}

使用

menu.html

  1. <p>这是一个菜单</p>

index.html

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>Title</title>
  6. </head>
  7. <body>
  8. <div class="h2">
  9. {% include 'menu.html' %}
  10. {% include 'menu.html' %}
  11. {% include 'menu.html' %}
  12. {% include 'menu.html' %}
  13. </div>
  14. </body>
  15. </html>

模板的继承

继承父模版页面,可以在子模版使用该页面上面所有的资源

语法

父模版

  1. {% block 名称 %}
  2. ...
  3. {% endblock %}

子模版

  1. {% extends "模版名称" %}

使用

父模版

先在模板中通过block定义那些区域内容可以被修改

  1. <h4>个人信息</h4>
  2. <p>姓名:{% block name %}(请自定义){% endblock %}</p>
  3. <p>年龄:{% block age %}(请自定义){% endblock %}</p>

子模版

子模板继承父模板,并修改划定的区域

  1. <html>
  2. <body>
  3. {% extends "menu.html" %}
  4. {% block name %}kevin{% endblock %}
  5. {% block age %}22{% endblock %}
  6. </body>
  7. </html>

Django之模版层 - 图1

block 标签的部分已经被自定义的内容替换掉了,如果没有修改规定区域,将会继续使用父模板中的内容。如果想要在父模板 block中新增内容而不是完全覆盖,可以使用{{ block.super }}

  1. <html>
  2. <body>
  3. {% extends "menu.html" %}
  4. {% block name %}kevin{% endblock %}
  5. {% block age %}22{{ block.super }} (新增的内容){% endblock %}
  6. </body>
  7. </html>