内容概要
- 模板层传值语法
- 模板层语法-过滤器
- 模板层标签语法
- 模型层自定义标签、过滤器与inclusion_tag
- 模型层模板继承与导入
模板层传值语法
"""
django提供的模板语法只有两个符号
{{}}:主要用于变量相关操作(引用)
{%%}:主要用于逻辑相关操作(循环、判断)
"""
1.传值的两种方式
# 传值方式1:指名道姓的传,适用于数据量较少的情况,节省资源
return render(request, 'ab.html', {'name':name})
# 传值方式2:打包传值,适用于数据量较多的情况(偷懒),浪费资源
'''locals() 将当前名称空间中所有的名字全部传递给html页面'''
return render(request, 'ab_temp.html', locals())
2.传值的范围
基本数据类型都可以;
函数名:
模板语法会自动加括号执行并将函数的返回值展示到页面上;
不支持传参(模板语法会自动忽略有参函数);
文件名:
直接显示文件IO对象;
类名:
自动加括号实例化成对象;
对象名:
直接显示对象的地址,并且具备调用属性和方法的能力;
# django模板语法针对容器类型的取值 只有一种方式>>>:句点符
data1 = {'info':{'pro':[11, 22, 33, {'name':'jason','msg':'努力就有收获'}]}};
既可以点key值也可以点索引,django内部会自动识别;
{{ data1.info.pro.3.msg }}
模板层语法-过滤器
{{ 数据对象|过滤器名称:参数 }} 过滤器最多只能额外传输一个参数
eg: <p>统计数据的长度:{{ s1|length }}</p>
过滤器 | 用法 | 代码 |
---|---|---|
last | 获取列表/元组的最后一个成员 | {{liast | last}} |
first | 获取列表/元组的第一个成员 | {{list|first}} |
length | 获取数据的长度 | {{list | length}} |
defualt | 当变量没有值的情况下, 系统输出默认值, | {{str|default="默认值"}} |
safe | 让系统不要对内容中的html代码进行实体转义 | {{htmlcontent| safe}} |
upper | 字母转换成大写 | {{str | upper}} |
lower | 字母转换成小写 | {{str | lower}} |
title | 每个单词首字母转换成大写 | {{str | title}} |
date | 日期时间格式转换 | `{{ value |
cut | 从内容中截取掉同样字符的内容 | {{content | cut:"hello"}} |
list | 把内容转换成列表格式 | {{content | list}} |
add | 加法 | {{num| add}} |
filesizeformat | 把文件大小的数值转换成单位表示 | {{filesize | filesizeformat}} |
join |
按指定字符拼接内容 | {{list| join("-")}} |
random |
随机提取某个成员 | {list | random}} |
slice |
按切片提取成员 | {{list | slice:":-2"}} |
truncatechars |
按字符长度截取内容 | {{content | truncatechars:30}} |
truncatewords |
按单词长度截取内容 | 同上 |
模板语法-标签(类似于流程控制)
语法结构
{% 名字 ...%}
{% end名字 %}
if判断与for循环
<!-- if判断 -->
{% if b %}
<p>你好啊</p>
{% elif s1 %}
<p>他好呀</p>
{% else %}
<p>大家好</p>
{% endif %}
<!-- for循环 -->
{% for i in l1 %}
<p>{{i}}</p>
{% endfor %}
提供了forloop关键字,可以在for循环前提下使用,forloop结果如下:
结果x,{'parentloop': {}, 'counter0': 0, 'counter': 1, 'revcounter': 4, 'revcounter0': 3, 'first': True, 'last': False} <!-- 这是forloop的一条记录 -->
counter0:从零开始计算索引,当前元素的索引值
counter:从1开始计算索引,当前元素的索引值
revcounter:从1开始计算索引,将索引值反过来后当前元素的索引值
revcounter0:从0开始计算索引,将索引值反过来后当前元素的索引值
first:表示当前元素是否是第一个元素
last:表示当前元素是否是最后一个元素
...
<!-- for循环中forloop使用+if判断 -->
{% for i in l1 %}
{% if forloop.first %}
<p>这是第一次循环</p>
{% elif forloop.last %}
<p>这是最后一次循环</p>
{% else %}
<p>中间循环</p>
{% endif %}
{% empty %} <!-- for循环对象为空时执行下面代码 -->
<p>for循环对象为空 自动执行</p>
{% endfor %}
ps:针对字典同样提供了keys、values、items方法
{% for foo in user_info %}
{{ foo }} <!-- 默认取字典k值 -->
{% endfor %}
{% for foo in user_info.keys %}
{{ foo }} <!-- 取字典所有k值 -->
{% endfor %}
{% for foo in user_info.values %}
{{ foo }} <!-- 取字典所有v值 -->
{% endfor %}
{% for foo in user_info.items %}
{{ foo }} <!-- 取字典所有键值对,元组形式 -->
{% endfor %}
自定义过滤器、标签及inclusion_tag
"""
如果想要自定义一些模板语法 需要先完成下列的三步走战略
1.在应用下创建一个名字必须叫templatetags的目录
2.在上述目录下创建任意名称的py文件
3.在上述py文件内先编写两行固定的代码
from django import template
register = template.Library()
"""
# 自定义过滤器(最大只能接收两个参数)
@register.filter(name='myadd')
def func1(a, b):
return a + b
{% load mytags %}
<p>{{ i|myadd:1 }}</p>
# 自定义标签(参数没有限制)
@register.simple_tag(name='mytag')
def func2(a, b, c, d, e):
return f'{a}-{b}-{c}-{d}-{e}'
{% load mytags %}
{% mytag 'jason' 'kevin' 'oscar' 'tony' 'lili' %}
# 自定义inclusion_tag(局部的html代码)
@register.inclusion_tag('menu.html',name='mymenu')
def func3(n):
html = []
for i in range(n):
html.append('<li>第%s页</li>'%i)
return locals()
{% load mytags %}
{% mymenu 20 %}
模板的继承与导入
母板(模板)的继承
多个页面有很多相似的地方 我们可以采取下列方式
方式1:传统的复制粘贴 (代码重复性太高!浪费资源,而且不方便)
方式2:模板的继承
1.在母板中使用block划定子板可以修改的区域
语法:
{% block 区域名称 %}
{% endblock %}
2.子板继承模板
html页面清空
首行编写: { % extend '母版名称.html' % }
{ % block 区域名称% }
子板的内容
{ % end block % }
3.完全体
在母版中 应该至少划分三个区域
1.页面内容区域
2.CSS样式区
3.JS代码区
子板可以重复使用母版的内容
{{block.super}}
模板的导入(了解)
将某个html的部分提前写好 之后很多html页面都想使用就可以导入
{% include 'myform.html' %}
标签:list,django,语法,索引,html,foo,模板
From: https://www.cnblogs.com/ddsuifeng/p/16982366.html