知识点:模板语法之变量的深度查询方法,基本过滤器的用法和自定义过滤器的方法,模板语法之标签的使用和自定义标签。
模板语法
filter
{{}}
1 变量
句点符,深度查询(可以点到方法,不要加括号,只能是无参的方法)
-----------------------此处插入变量模板语法------------------------
注意:不符合条件的过滤会返回空
2 过滤器
过滤器基本格式:{{变量名|过滤器名称:过滤条件}}===》变量名都可以写成变量值。
import datetime
now = datetime.datetime.now() ===》变量是视图函数里定义的变量,视图函数调用模板并对模板进行渲染
视图函数的变量就是模板{{}}里的变量。
<p>date过滤器 {{ now|date:'Y-m-d:H:i:s' }}</p>
<p>date过滤器 {{ now|date }}</p>
如果一个变量是false或者为空,使用给定的默认值。如果不为空,使用变量原来的值。就相当于给为空的变量设置默认值。例如:
前面的变量名都可以写成变量值
<p>default过滤器 {{ ss2|default:'字符串没有值' }}</p>
<p>default过滤器 {{ ll3|default:'列表没有值' }}</p>
返回值的长度。它对字符串和列表都起作用
<p>length过滤器 {{ ll2|length }}</p> # 不用加冒号
将值格式化为一个 “人类可读的” 文件尺寸 (例如 '13 KB', '4.1 MB', '102 bytes', 等等)。例如:
<p>filesizeformat过滤器 {{ file|filesizeformat }}</p>
<p>filesizeformat过滤器 {{ 1024|filesizeformat }}</p> ===》1kb
切片操作
如果变量长度小于切片,只获取变量最大长度的值。
<p>slice过滤器 {{ 'lqzisbig'|slice:'1:9' }}</p>
如果字符串字符多于指定的字符数量,那么会被截断。截断的字符串将以可翻译的省略号序列(“...”)结尾
<p>truncatechars过滤器 {{ 'lqzisbigdddddddeee'|truncatechars:9 }}</p> # 先减去三个点的长度
<p>truncatewords过滤器: {{ 'lqz is big and egon is small'|truncatewords:3 }}</p>
<p>safe过滤器: {{ ss3|safe }}</p> ==》如果不用safe过滤,存到数据库的数据取出来渲染模板,返回给浏览器还是显示的标签内容。
xss攻击:跨站脚本攻击
{#可以在视图函数里处理#}
from django.utils.safestring import mark_safe
ss3=mark_safe(ss3)
<p>safe过滤器: {{ ss3|safe }}</p>
俩参数可以传字符串和数字,具体详见源码
<p>add过滤器: {{ 12|add:"3" }}</p>
<p>add过滤器: {{ 'eee'|add:"3rrr" }}</p>
tag:模板标签的用法
{% %}
for、if、with都要有对应的结束标签
for :forloop ===》小难点
问题:forloop.first和forloop.last的值以及用途
解析:first和last这两个属性很重要 可以用来获取循环开始的信息和循环结束的信息。
{%for i in ll%}
#forloop必须在for循环里使用
注释:parentloop是由多层循环里面层次的循环才能看到字典里有值。外面打印parentloop只能看到空字典。
{{forloop}} ===》{'parentloop': {}, 'counter0': 0, 'counter': 1, 'revcounter': 3, 'revcounter0': 2, 'first': True, 'last': False}
#{%empty%}是比如循环的是空列表或者空字符串或直接跳到empty,输出empty内容
{% empty%}
{% endfor%}
if if语句支持 and 、or、==、>、<、!=、<=、>=、in、not in、is、is not判断。
{%if 条件%}
{% endif%}
补充了一个循环字典:
{%for i,v in dic.items%} 这儿着重注意:for虽然是一个标签函数,但是后面的参数i,v还是不能分开,用来变量解压的i,v需要用逗号分开。
第一种写法:
{% with aa=dic.name%}
{{aa}}
{%endwith%}
第二种写法:
{% with dic.name as aa%}
{{aa}}
{%endwith%}
自定义过滤器
1 先去setting里面把app名字配置上
2 在app目录下创建一个templatetags模块===》templatetags文件夹
3 写py文件(my_test.py)===》templatetags下建py文件
4 from django import template ===》导入template模块
5 register=template.Library() ===》固定格式
6 写函数 addstr(用register.filter()装饰)
7 模板里导入文件夹my_test:
8 {% load my_test %}
9 {{'lqz'|addstr:'isbig' }} #最多只能传两个参数
自定义标签:
1 先去setting里面把app名字配置上
2 再app目录下创建一个templatetags模块
3 写py文件(my_test.py)
4 from django import template
5 register=template.Library()
6 写函数 my_sum@register.simple_tag(name='yy')装饰)
@register.simple_tag(name='yy')
def my_sum(x,y,z,i):
return x+y+z+i
7 模板:
8 {% load my_test %}
9 {% yy 12 34 56 78 %} #以空格做分割,传参数
下面附上今天作业的两个函数
作业:
1 上课讲的整理完
2 自定义一个标签(输入一个值,计算出阶乘,显示在页面)
3 自定义一个过滤器 (输入两个参数,做累加,支持数字,字符串(如果一个数字,一个字符串,强行相加))
作业注意点:冒号后的数字是Safetext类型,不能用str转换。
参数:自定义过滤器只能接受两个参数,第一个是变量名,第二个是冒号后面的参数。
1 from django import template 2 # 必须用reqgister这个名字,一点都不能错 3 # register是Library的对象 4 register = template.Library() 5 # 自定义过滤器 6 # filter是Library里的方法,用register对象调用 7 @register.filter(name='tt') 8 def addrstr(x,y): # 只能有两个值 9 # if type(x) is str and type(y) is str: 10 # return str(x) + str(y) 11 if type(x) is str: 12 return str(x) +y 13 elif type(x) is not str: 14 return str(x) + y 15 return x+y 16 17 # 自定义标签 18 @register.simple_tag(name='yy') 19 def my_sum(x): 20 m = 1 21 for i in range(x): 22 m = m*(i+1) 23 return m
笔记附录:
views视图函数:
1 from django.shortcuts import render 2 from django.utils.safestring import mark_safe 3 # Create your views here. 4 class Person: 5 def __init__(self,name): 6 self.name=name 7 @classmethod 8 def class_test(cls): 9 print('class method') 10 return 'class method' 11 def test(self): 12 print('method') 13 return self.name 14 # def __str__(self): 15 # return self.name 16 17 def index(request): 18 ss='lqz is big' 19 i=20 20 ll=['lqz',18,[1,2,[2,3]]] 21 ll4=[[1,2,3],[2,3,4],[1,2,9]] 22 dic={'name':'lqz','age':18,'t':[1,2,[2,3]]} 23 b=True 24 lqz=Person('lqz') 25 egon=Person('egon') 26 xiaohou=Person('xiaohou') 27 monkey=Person('monkey') 28 ll2=[lqz,egon,xiaohou,monkey] 29 dic2={'lqz':lqz,'egon':egon} 30 # print(lqz.class_test()) 31 # print(dic['name'].upper) 32 ll3=[] 33 ss2='' 34 ss3='<a href="https://www.baidu.com">点我</a>' 35 ss3=mark_safe(ss3) 36 import datetime 37 now=datetime.datetime.now() 38 file=1024*1024*1024 39 40 # locals()要加括号 表示所有index函数下变量都可以放到模板里面 41 # 缺点:函数外部引入的变量也可以放在里面,可能会造成变量重复。 42 return render(request,'index.html',locals()) 43 # return render(request,'index.html',{'ss':ss,})
1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4 <meta charset="UTF-8"> 5 <title>Title</title> 6 {# <link rel="stylesheet" href="/static123/mycss.css">#} 7 {% load static %} 8 <link rel="stylesheet" href="{% static 'mycss.css'%}"> 9 10 11 </head> 12 <body> 13 <hr> 14 <p>add:{{ '123'|add:'134' }}</p> 15 <p>add:{{ 123|add:134 }}</p> 16 <p>add:{{ 'err'|add:134 }}</p> 17 <p>add:{{ 'err'|add:'ttyy' }}</p> 18 <p>safe过滤器: {{ ss3|safe }}</p> 19 <p>截断:{{ 'ddf ddh jjjjej'|truncatechars:8 }}</p> 20 <p>截断:{{ 'ddf ddh jjjjej'|truncatewords:2}}</p> 21 <p>切片:{{ 'lqz is dsb'|slice:'1:12' }}</p> 22 <p>文件:{{ file|filesizeformat }}</p> 23 <p>文件:{{ 1024|filesizeformat }}</p> 24 <p>不为空:{{ 'lqz 111'|default:'egon is dsb' }}</p> 25 <p>字符串:{{ ss }}</p> 26 <p>数字:{{ i }}</p> 27 <p>列表:{{ ll }}</p> 28 句点符,做深度查询 29 <p>列表第2个值:{{ ll.2.2.0}}</p> 30 <p>布尔类型:{{ b}}</p> 31 <p>字典:{{ dic }}</p> 32 <p>字典取值:{{ dic.age }}</p> 33 <p>字典取值:{{ dic.t.2.1 }}</p> 34 <p>对象:{{ lqz }}</p> 35 <p>对象取值:{{ lqz.name }}</p> 36 执行方法,不要加括号, 37 <p>对象方法:{{ lqz.test }}</p> 38 <p>类方法:{{ lqz.class_test }}</p> 39 注释:前端看不到,django给处理了 40 {#<p>类方法:{{ Person}}</p>#} 41 <p>列表对象{{ ll2 }}</p> 42 <p>列表对象取值{{ ll2.1 }}</p> 43 <p>列表对象取值,在取值{{ ll2.1.name }}</p> 44 <p>对象字典{{ dic2 }}</p> 45 <p>对象字典取值{{ dic2.egon.name }}</p> 46 <p>空列表的情况{{ ll3 }}</p> 47 直接替换成空 48 <p>空字符串的情况{{ ss2 }}</p> 49 50 <p>a标签 {{ ss3 }}</p> 51 <h4>字典:{{ ss.upper }}</h4> 52 <h4>字典:{{ dic.name.upper }}</h4> 53 < 54 55 {#<script>alert('dsb')</script>#} 56 冒号后不能加空格 now是第一个参数,冒号后面是第二个参数 57 <p>date过滤器 {{ now|date:'Y-m-d:H:i:s' }}</p> 58 <p>date过滤器 {{ now|date }}</p> 59 如果一个变量是false或者为空,使用给定的默认值。否则,使用变量的值。例如: 60 <p>default过滤器 {{ ss2|default:'字符串没有值' }}</p> 61 <p>default过滤器 {{ ll3|default:'列表没有值' }}</p> 62 返回值的长度。它对字符串和列表都起作用 63 <p>length过滤器 {{ ll2|length }}</p> 64 将值格式化为一个 “人类可读的” 文件尺寸 (例如 '13 KB', '4.1 MB', '102 bytes', 等等)。例如: 65 <p>filesizeformat过滤器 {{ file|filesizeformat }}</p> 66 <p>filesizeformat过滤器 {{ 1024|filesizeformat }}</p> 67 切片操作 68 <p>slice过滤器 {{ 'lqzisbig'|slice:'1:9' }}</p> 69 如果字符串字符多于指定的字符数量,那么会被截断。截断的字符串将以可翻译的省略号序列(“...”)结尾 70 <p>truncatechars过滤器 {{ 'lqzisbigdddddddeee'|truncatechars:9 }}</p> 71 <p>truncatewords过滤器: {{ 'lqz is big and egon is small'|truncatewords:3 }}</p> 72 <p>safe过滤器: {{ ss3|safe }}</p> 73 {#可以在视图函数里处理#} 74 <p>safe过滤器: {{ ss3|safe }}</p> 75 俩参数可以传字符串和数字,具体详见源码 76 <p>add过滤器: {{ 12|add:"3" }}</p> 77 <p>add过滤器: {{ 'eee'|add:"3rrr" }}</p> 78 79 <hr> 80 <h1>模板语法之标签</h1> 81 82 {% for foo in ll %} 83 <p>{{ forloop }}</p> 84 <p>{{ forloop.counter }}</p> 85 <p>{{ forloop.counter0 }}</p> 86 <p>{{ forloop.revcounter }}</p> 87 <p>{{ forloop.revcounter0 }}</p> 88 <p>{{ forloop.first }}</p> 89 <p>{{ forloop.last }}</p> 90 {% if forloop.first %} 91 lqz is big 92 {% elif forloop.last %} 93 俩人都小 94 {% else %} 95 egon is small 96 97 {% endif %} 98 99 <p>{{ foo }}</p> 100 101 {% endfor %} 102 {% for foo in ll %} 103 <p>{{ foo }}</p> 104 {% empty %} 105 没有值 106 {% endfor %} 107 108 {% for foo in ll3 %} 109 <p>{{ foo }}</p> 110 111 {% empty %} 112 一定要放在for循环中 113 没有值 114 {% endfor %} 115 <hr> 116 {% for foo in ll4 %} 117 {% for i in foo %} 118 <p>{{ forloop }}</p> 119 <p>{{ forloop.parentloop }}</p> 120 121 122 {% endfor %} 123 124 {% endfor %} 125 126 if语句支持 and 、or、==、>、<、!=、<=、>=、in、not in、is、is not判断。 127 128 {% with ttttt=dic.name %} 129 相当于重新赋值 130 <p>{{ dic.name }}</p> 131 <p>{{ ttttt }}</p> 132 <p>{{ ttttt }}</p> 133 <p>{{ ttttt }}</p> 134 135 136 {% endwith %} 137 <hr> 138 <h1>自定义标签</h1> 139 {% load my_test %} 140 141 {{ '123'|tt:'111' }} 142 143 {% yy 5 %} 144 145 {% if 'lqz'|tt:'isbig'%} 146 {% yy 6 %} 147 148 {% endif %} 149 自定义的过滤器,可以放在if判断里, 150 自定义的标签,不能放在if判断里条件里 151 {#{% if yy 12 3 17 89 %}#} 152 {# zifuc#} 153 {##} 154 {#{% endif %}#} 155 </body> 156 </html>
{% load static %}
<link rel="stylesheet" href="{% static 'mycss.css'%}"> 相当于反向解析,STATIC_URL改变,后面涉及到的也会随之改变。
这里的static是封装的一个函数。
这里的返回值是static/mycss.css/
<link rel='stylesheet' href='{%get_static_prefix%}mycss.css'>
这里的返回值是/static/