摘要:
模版层(模板语法)
-
模板语法
-
过滤器
-
标签
-
自定义过滤器、标签
-
inclusion_tag
-
模板的继承
-
模板的导入
一、模板语法:
-
常用语法:
{{ }} 变量相关
{% %} 逻辑相关 -
变量:
在Django中的模板语言用{{ 变量名 }}来使用变量,而这个变量的来源通常是在视图函数里面产生的,通过render方法返回到前端,前端通过此语法来使用该变量。
后端向前端页面传递数据的方式:# 第一种: return render(request,'index.html',{'n':n}) # 第二种: return render(request,'index.html',locals()) # 将当前所在的名称空间中的名字全部传递给前端页面
后端的传递的数据类型可以是:int、str、list、dict、tuple、set、function....
传递的变量命名规则:包括任何字母数字以及下划线 ("_")的组合, 变量名称中不能有空格或标点符号。
模板语法规定:使用句点符(就是点号:.)来取出变量中的相关数据,比如字典、列表、元祖、属性方法(对象)
这里还需要强调一点:模板语法是不支持传参的。
模板中支持的写法:后端:views.py l = [1,2,3,4,5,user_obj] user_obj = models.Book.object.filter(id=1).first() d = {'name': 'sgt', 'password': '123'} 前端:使用模板语法,来处理后端传递过来的变量 {# 取l中的第一个参数 #} {{ l.0 }} {# 取字典d中相应的值 #} {{ d.name }} {{ d.keys }} {{ d.values }} {{ d.items }} {# 取对象的name属性 #} {{ user_obj.name }} {# .操作只能调用不带参数的方法 #} {{ l.5.name }} {% with l.5.name as h %} {{ h }} {% endwith %} {# 将 l.5.name找到的数据起名为h,这样就可以通过h这个名字得到 l.5.name的值 #}这里特别来说说把
函数:后端: def func(): return '你调用了我?' 前端: {{ func }} 显示结果:你调用了我? 在前端调用后端的函数名(当然此函数名肯定在locals()里面)时,会调用该函数(函数名加括号),得到函数调用的返回值,如果无返回值则为None类:
后端
class Demo(object): def __init__(self, name): self.name = name def func(self): return self.name @classmethod def test(cls): return 'cls' @staticmethod def foo(name,age): return 'static_foo' obj = Demo('sgt')<app01.views.ttt.<locals>.Demo object at 0x0000024052F39898> cls sgt sgt如果类里面加入:
def __str__(self): return 'Sgt帅得一塌糊涂!'
那么{{ obj }}的结果就会变成:Sgt帅得一塌糊涂!(因为__str__会拦截打印动作,在前端{{ obj }}实际上就是类似于打印obj.
二、过滤器:(Filters)
-
常用过滤器介绍:
在Django的模板语言中,通过使用 过滤器 来改变变量的显示。过滤器的语法: {{ value|filter_name:参数 }}
使用管道符"|"来应用过滤器。
这里的过滤的意思实际上个人认为概念很模糊,过滤器的意思是将变量通过使用后端的方法将变量进行相关操作加工逻辑处理的封装之后拿到前端去使用的一种过程实现。
例如:{{ name|lower }}会将name变量应用lower过滤器之后再显示它的值。lower在这里的作用是将文本全都变成小写。
注意事项:
##过滤器支持链式操作,即一个过滤器的输出结果作为另一个过滤器的输入
##过滤器可以接收参数,例如:{{ sss|truncatewords:30 }},这将显示sss的前30个词。
##过滤器参数包含空格的话,必须用引号包裹起来,比如使用逗号和空格去连接一个列表中的元素,如:{{ list|join:', ' }}
##管道符‘|’左右没有空格。一定要注意,没有空格
Django的模板语言中提供了大约六十个内置过滤器。这里主要拿出一些常见的方法来介绍:
#default
如果一个变量是false或空,使用给定的默认值,否则使用该变量的值。{{ value|default:"nothing"}} 如果value没有传值或者值为空的话就显示nothing#length
返回值的长度,作用于字符串和列表{{ value|length }} 后端: s = 'what f**k!' l = ['a', 'b', 4, 5, 8] 前端: {{ l|length }} {{ s|length }} 显示结果:5 10#filesizeformat
将值格式化为一个可理解的文件大小单位(13kb,4m){{ value|filesizeformat }} 后端: n = 102478450 前端: {{ n|filesizeformat }} 显示结果:97.7 MB#slice 切片(顾头不顾尾)
{{value|slice:"开始索引:结束索引:步长"}} 后端: s = 'what f**k!' l = ['a', 'b', 4, 5, 8] 前端: {{ l|slice:'1:4' }} {{ s|slice:'5:9' }} {{ l|slice:'2:-1' }} <!--从索引2开始切,切到索引为-1的位置为结尾,同时顾头不顾尾--> 显示结果: ['b', 4, 5]
f**k
[4, 5]#date 时间格式化输出
{{ value|date:"Y-m-d H:i:s"}} 后端: import datetime ctime = datetime.datetime.now() 前端: {{ ctime }} {{ ctime|date:'Y-m-d H:i:s' }} 显示结果: June 11, 2019, 2:51 p.m. 2019-06-11 14:51:24日期格式化参数a 'a.m.' 或 'p.m.' (注意,它与PHP 的输出略有不同.它包括了句点(django扩展). 'a.m.' A 'AM' 或 'PM'. 'AM' B 未实现. d 每月第几天, 带前导零 '01' to '31' D 每周第几天,3字母的字符串. 'Fri' f 时间, 12-小时制的小时和分钟数, 如果分钟数为零,则不显示.(django 扩展). '1', '1:30' F 月份, 长文本格式. 'January' g 小时, 12-小时制,没有前导零 '1' to '12' G 小时, 24-小时制,没有前导零 '0' to '23' h 小时, 12-小时制,有前导零 '01' to '12' H 小时, 24-小时制,有前导零 '00' to '23' i 分钟. '00' to '59' I 未实现 j 每月第几天, 无前导零 '1' to '31' l 每周第几天,长文本格式. 'Friday' L 是否闰年. True or False m 数字表示的月份,有前导零. '01' to '12' M 月份,3字母短文本格式. 'Jan' n 数字表示的月份,无前导零 '1' to '12' N 出版风格的月份缩写(django 扩展) 'Jan.', 'Feb.', 'March', 'May' O 与格林威治的时间差(以小时计) '+0200' P 12小时制的小时分钟及'a.m.'/'p.m.' 分钟数若为零则不显示. 用字符串表示特殊 的时间点, 如 'midnight' 和 'noon' (django扩展) '1 a.m.', '1:30 p.m.', 'midnight','noon', '12:30 p.m.' r RFC 822 格式的日期 . 'Thu, 21 Dec 2000 16:01:07+0200' s 秒数, 带有前导零的数字表示 '00' to '59' S 英语序数后缀,用于一个月的第几天,2个字符 'st', 'nd', 'rd' or 'th' t 给定月共有多少天. 28 to 31 T 本机时区. 'EST', 'MDT' U 未实现 w 一周中的第几天,没有前导零的数字 '0' (Sunday) to '6' (Saturday) W ISO-8601 一年的第多少星期数, 一周从 星期一开始 1, 23 y Year, 2 位数字表示 '99' Y Year, 4 位数字表示 '1999' z 一年中的第几天 . 0 to 365 Z 以秒计的时区偏移量. 这个偏移量对UTC西部 时区总是负数,而对UTC东部时区则总是正数 -43200 to 43200