模板层
Posted xujinjin18
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了模板层相关的知识,希望对你有一定的参考价值。
filter {{}} 1 变量 1 句点符,深度查询 2 可以点到方法,不要加括号,只能是无参的方法 3 xss跨站脚本攻击: 比如提交评论<script>alert(‘dsb‘)</script> 存到数据库 响应到html 浏览器解释 就会弹窗 如果for循环一千次或者多次 页面就崩了 这就是xss攻击 所以一定要处理 如果不要django处理(比如:<用> 替换) 就要显示标签可以这样处理: 1 ss3=mark_safe(ss3) from django.utils.safestring import mark_safe 在views中 2 <p>safe过滤器: {{ ss3|safe }}</p> html中
3 @register.simple_tag(is_safe=False) 默认是true,防止xss攻击,显示字符串。false浏览器直接解释标签 自定义标签时设置false 2 过滤器 冒号后不能加空格 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> 将值格式化为一个 “人类可读的” 文件尺寸 单位是B (例如 ‘13 KB‘, ‘4.1 MB‘, ‘102 bytes‘, 等等)。例如: <p>filesizeformat过滤器 {{ file|filesizeformat }}</p> <p>filesizeformat过滤器 {{ 1024|filesizeformat }}</p> 切片操作 <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 xss攻击:跨站脚本攻击 1 在html中处理 <p>safe过滤器: {{ ss3|safe }}</p> 2 {#也可以在视图函数里处理#} from django.utils.safestring import mark_safe ss3=mark_safe(ss3) 俩参数可以传字符串和数字,具体详见源码 <p>add过滤器: {{ 12|add:"3" }}</p> <p>add过滤器: {{ ‘eee‘|add:"3rrr" }}</p> tag {% %} for :forloop {%for i in ll%} #必须再for循环里使用 {{forloop}} 字典 # {% empty%}} 判断是否为空 {% endfor%} if if语句支持 and 、or、==、>、<、!=、<=、>=、in、not in、is、is not判断。 {%if 条件%} {% endif%} {% with aa=dic.name%} 起别名 {{aa}} {%endwith%} 自定义过滤器 1 先去setting里面把app名字配置上 2 再app目录下创建一个templatetags模块 3 写py文件(my_test.py) 4 from django import template 5 register=template.Library() 6 写函数 addstr(用register.filter()装饰) 7 模板: 8 {% load my_test %} 9 {{‘lqz‘|addstr:‘isbig‘ }} #最多只能传两个参数 自定义标签: settings app01-templatetags-my_test.py 1 先去setting里面把app名字配置上 (除非新加的一般都是弄好的) 2 再app目录下创建一个templatetags模块 3 写py文件(my_test.py) 4 from django import template 5 register=template.Library() 6 写函数 [email protected]_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 %} #以空格做分割,传参数 @register.simple_tag(name=‘yy‘) @register.simple_tag(is_safe=False) 默认是true,防止xss攻击,显示字符串。false浏览器直接解释标签 自定义的过滤器,可以放在if判断里, 自定义的标签,不能放在if判断里条件里 静态文件写活: css路径修改的话html引用不必改变 index.html: {% load static %} <link rel="stylesheet" href="{% static ‘mycss.css‘ %}"> 写死的 <link rel="stylesheet" href="/static/mycss.css"> 练习: 自定义一个标签(输入一个值,计算出阶乘,显示再页面) 自定义一个过滤器 (输入两个参数,做累加,支持数字,字符串(如果一个数字,一个字符串,强行相加))
from django import template register=template.Library() @register.filter def myadd(value,arg): if type(value) == type(arg) == int or type(value) == type(arg) == str: return value+arg elif type(value) == int and type(arg) == str: return str(value) + arg elif type(value) == str and type(arg) == int: return value + str(arg) else: return ‘参数只能是数字或字符串‘ @register.simple_tag def myfactorial(n): if type(n) != int: # raise ValueError return ‘ValueError‘ if n == 0 or n == 1: return 1 else: return (n*myfactorial(n-1))
from django.shortcuts import render from django.utils.safestring import mark_safe # Create your views here. class Person: def __init__(self,name): self.name = name @classmethod def class_test(cls): print(‘class method‘) return ‘class method‘ def test(self): print(‘method‘) return self.name # def __str__(self): # return self.name def index(request): n1 = 1 n2 = 2 n3 = 5 s1=‘a‘ s2=‘b‘ ss=‘lqz is big‘ i=20 ll=[‘lqz‘,18,[1,2,[2,3]]] ll4=[[1,2,3],[2,3,4],[1,2,9]] dic={‘name‘:‘lqz‘,‘age‘:18,‘t‘:[1,2,[2,3]]} b=True lqz=Person(‘lqz‘) egon=Person(‘egon‘) xiaohou=Person(‘xiaohou‘) monkey=Person(‘monkey‘) ll2=[lqz,egon,xiaohou,monkey] dic2={‘lqz‘:lqz,‘egon‘:egon} # print(lqz.class_test()) # print(dic[‘name‘].upper) ll3=[] ss2=‘‘ ss3=‘<a href="https://www.baidu.com">点我</a>‘ # ss3=mark_safe(ss3) import datetime now=datetime.datetime.now() file=1024*1024*1024 return render(request,‘index.html‘,locals()) # return render(request,‘index.html‘,{‘ss‘:ss,}) 建议使用这种
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>index</title> {% load static %} <link rel="stylesheet" href="{% static ‘mycss.css‘ %}"> {# <link rel="stylesheet" href="/staticaa/mycss.css">#} </head> <body> <div>静态文件写活</div> <hr> {% load my_tags %} {#{{ ‘12‘|add }}#} <p>{{ n1|myadd:n2 }}</p> <p>{{ s1|myadd:s2 }}</p> <p>{{ s1|myadd:n2 }}</p> <p>{{ ‘@#@‘|myadd:33 }}</p> {% myfactorial ‘a‘ %} 自定义的过滤器,可以放在if判断里, 自定义的标签,不能放在if判断里条件里 <hr> <h3>变量</h3> <p>字符串:{{ ss }}</p> <p>数字:{{ i }}</p> <p>列表:{{ ll }}</p> <h3>句点符,做深度查询</h3> <p>列表第2个值:{{ ll.2.2.0}}</p> <p>布尔类型:{{ b}}</p> <p>字典:{{ dic }}</p> <p>字典取值:{{ dic.age }}</p> <p>字典取值:{{ dic.t.2.1 }}</p> <p>对象:{{ lqz }}</p> <p>对象取值:{{ lqz.name }}</p> <h2>对象方法,不要加括号</h2> <p>对象方法:{{ lqz.test }}</p> <p>类方法:{{ lqz.class_test }}</p> <h3>注释:前端看不到,django给处理了</h3> {#<p>类方法:{{ Person}}</p>#} <p>列表对象{{ ll2 }}</p> <p>列表对象取值{{ ll2.1 }}</p> <p>列表对象取值,在取值{{ ll2.1.name }}</p> <p>对象字典{{ dic2 }}</p> <p>对象字典取值{{ dic2.egon.name }}</p> <p>空列表的情况就是一个空列表{{ ll3 }}</p> <p>空字符串的情况 直接替换成空{{ ss2 }}</p> <h3>xss 跨站脚本攻击 django为了解决这种攻击行为所以对标签进行了处理 特殊符号替换 浏览器不能直接解释标签只能原样输出 ,如果想直接让浏览器解释这个标签 需要用 mark_safe()函数 在views中 告诉django不要处理</h3> <p>a标签 {{ ss3 }}</p> <h4>字典:{{ ss.upper }}</h4> <h4>字典:{{ dic.name.upper }}</h4> < {#<script>alert(‘dsb‘)</script>#} {# xss:比如提交评论 存到数据库 响应到html 浏览器解释 就会弹窗 这就是xss攻击 所以一定要处理 #} <h2>过滤器</h2> 冒号后不能加空格 now是第一个参数,冒号后面是第二个参数 <p>date过滤器 {{ now|date:‘Y-m-d:H:i:s‘ }}</p> <p>date过滤器 {{ now|date }}</p> <hr> 如果一个变量是false或者为空,使用给定的默认值。否则,使用变量的值。例如: <p>default过滤器 {{ ss2|default:‘字符串没有值‘ }}</p> <p>default过滤器 {{ ll3|default:‘列表没有值‘ }}</p> <hr> 返回值的长度。它对字符串和列表都起作用 <p>length过滤器 {{ ll2|length }}</p> <hr> 将值格式化为一个 “人类可读的” 文件尺寸 单位是B(例如 ‘13 KB‘, ‘4.1 MB‘, ‘102 bytes‘, 等等)。例如: <p>filesizeformat过滤器 {{ file|filesizeformat }}</p> <p>filesizeformat过滤器 {{ 1024|filesizeformat }}</p> <hr> 切片操作 <p>slice过滤器 {{ ‘lqzisbig‘|slice:‘1:4‘ }}</p> <hr> 如果字符串字符多于指定的字符数量,那么会被截断。截断的字符串将以可翻译的省略号序列(“...”)结尾 带空格的字符串不算点的数量 不带空格的字符串算点的数量 <p>truncatechars过滤器 {{ ‘lqzisbigdddddddeee‘|truncatechars:9 }}</p> <p>truncatewords过滤器: {{ ‘lqz is big and egon is small‘|truncatewords:3 }}</p> <hr> <p>safe过滤器: {{ ss3|safe }}</p> {#可以在视图函数里处理 ss3=mark_safe(ss3)#} <p>{{ ss3 }}</p> <hr> 俩参数只能传字符串和数字 相加,具体详见源码 <p>add过滤器: {{ 12|add:"3" }}</p> <p>add过滤器: {{ ‘eee‘|add:"3rrr" }}</p> <hr> <h1>模板语法之标签</h1> {% for foo in ll %} <p>{{ forloop }}</p> <p>{{ forloop.counter }}</p> <p>{{ forloop.counter0 }}</p> <p>{{ forloop.revcounter }}</p> <p>{{ forloop.revcounter0 }}</p> <p>{{ forloop.first }}</p> <p>{{ forloop.last }}</p> {% if forloop.first %} lqz is big {% elif forloop.last %} 俩人都小 {% else %} egon is small {% endif %} <p>{{ foo }}</p> {% endfor %} <hr> {% for foo in ll %} <p>{{ foo }}</p> {% empty %} 没有值 {% endfor %} <hr> {% for foo in ll3 %} <p>{{ foo }}</p> {% empty %} 一定要放在for循环中 没有值 {% endfor %} <hr> {% for foo in ll4 %} {% for i in foo %} <p>{{ forloop }}</p> <p>{{ forloop.parentloop }}</p> {% endfor %} {% endfor %} <hr> if语句支持 and 、or、==、>、<、!=、<=、>=、in、not in、is、is not判断。 {% with ttttt=dic.name %} 相当于重新赋值 <p>{{ dic.name }}</p> <p>{{ ttttt }}</p> <p>{{ ttttt }}</p> <p>{{ ttttt }}</p> {% endwith %} <hr> <hr> </body> </html>
以上是关于模板层的主要内容,如果未能解决你的问题,请参考以下文章