模板层
1 变量 过滤器
2 标签
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%}
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>
4 静态文件动态引入
静态文件(static)引入的三种方式: 关注的文件:html和settings 核心:如果STATIC_URL = '/static/'--- >STATIC_URL = '/staticaaa/' 改变则动态引入的两种方式自动改变 一: <link rel="stylesheet" href="/static/dd/ssmycss.css"> 二: {% load static %} <link rel="stylesheet" href="{% static 'dd/ss/mycss.css' %}"> {# 返回值:/static/dd/ss/mycss.css#} 三: <link rel="stylesheet" href="{% get_static_prefix %}dd/ss/mycss.css">
5 模板导入和继承
模板导入和继承 html之间的问题
模板导入: 通用部分的html代码解决复用性
1 把公共部分,放到html里,比如叫 left.html
2 想在哪里用 {% include 'left.html' %} index.html
母版继承: 修改覆盖或者追加母版
1 写一个母版 base.html
2 要更改的地方( )
{% block base %}
母版的盒子里也可以写东西
{% endblock %}
3 调用:
3.1 写在第一行 {%extends 'base.html' %}
3.2 {% block base %}
自己的东西
{% endblock my_head%}
3.3 还想用母版里的内容({{block.super}} 放在那,原来母版里的东西,就会渲染在哪)
{% block base %}
{{block.super}}
自己的东西
{% endblock my_head%}
3.4 如过不继承盒子,它会用原来的内容,如果继承了,没写自己的东西,它会空白
3.5 盒子再继承时,跟顺序无关
<div> <div class="panel panel-danger"> <div class="panel-body"> Panel content </div> <div class="panel-footer">Panel footer</div> </div> <div class="panel panel-success"> <div class="panel-body"> Panel content </div> <div class="panel-footer">Panel footer</div> </div> <div class="panel panel-primary"> <div class="panel-body"> Panel content </div> <div class="panel-footer">Panel footer</div> </div> </div>
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>index</title> {% load static %} <link rel="stylesheet" href="{% static 'bootstrap-3.3.7-dist/css/bootstrap.min.css' %}"> <style> .head { height: 30px; background-color: pink; } </style> </head> <body> <div class="head"></div> <div class="container-fluid"> <div class="row"> <div class="col-md-3"> {% include 'left.html' %} </div> <div class="col-md-9"> </div> </div> </div> </body> </html>
继承
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> {% block myhead %} <title>index</title> {% endblock %} {% block top %} {% load static %} <link rel="stylesheet" href="{% static 'bootstrap-3.3.7-dist/css/bootstrap.min.css' %}"> {% endblock %} <style> .head { height: 30px; background-color: pink; } </style> </head> <body> <div class="head"></div> <div class="container-fluid"> <div class="row"> <div class="col-md-3"> {% block left %} {% endblock %} </div> <div class="col-md-9"> {% block right %} <h1>right</h1> {% endblock %} </div> </div> </div> </body> </html>
{% extends 'base.html' %} {% block myhead %} <title>order</title> {{ block.super }} {% endblock myhead %} {% block top %} {% load static %} <link rel="stylesheet" href="{% get_static_prefix %}bootstrap-3.3.7-dist/css/bootstrap.min.css"> {% endblock top %} {% block left %} <h1>left</h1> {% include 'left.html' %} {% endblock left %} {% block right %} <h1>aaaaaaaaaaaaaaaaa</h1> {{ block.super }} <h1>adfasdfasd</h1> {% load mytags %} {% my_inclusion 10 %} {% endblock %}
3 自定义标签,过滤器,inclusion_tag
自定义过滤器
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 写函数 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 %} #以空格做分割,传参数
@register.simple_tag(name='yy')
@register.simple_tag(is_safe=False) 默认是true,防止xss攻击,显示字符串。false浏览器直接解释标签
自定义的过滤器,可以放在if判断里,
自定义的标签,不能放在if判断里条件里
练习:
自定义一个标签(输入一个值,计算出阶乘,显示再页面)
自定义一个过滤器 (输入两个参数,做累加,支持数字,字符串(如果一个数字,一个字符串,强行相加))
自定义 inclusion_tag 返回字典(其值必须是可迭代对象),数据给指定的html使用,生成的html在html中和一般自定义标签一样使用 1 先去setting里面把app名字配置上 2 再app目录下创建一个templatetags模块 3 写py文件(mytags.py) 4 from django import template 5 register=template.Library() 6 @register.inclusion_tag('test.html') def my_inclusion(n): data=[] for i in range(n): data.append('第%s行'%i) return {'data':data} 7 写test.html页面 <ul> {% for choice in data %} <li>{{ choice }}</li> {% endfor %} </ul> 8 {% load my_test %} #order.html引用 9 {% my_inclusion 10 %} 它会返回html的页面
from django import template register=template.Library() @register.inclusion_tag('test.html') def my_inclusion(n): data = [] for i in range(n): data.append('第%s行' %i) return {'data':data}
<ul> {% for foo in data %} <li>{{ foo }}</li> {% endfor %} </ul>
{% extends 'base.html' %} {% block myhead %} <title>order</title> {{ block.super }} {% endblock myhead %} {% block top %} {% load static %} <link rel="stylesheet" href="{% get_static_prefix %}bootstrap-3.3.7-dist/css/bootstrap.min.css"> {% endblock top %} {% block left %} <h1>left</h1> {% include 'left.html' %} {% endblock left %} {% block right %} <h1>aaaaaaaaaaaaaaaaa</h1> {{ block.super }} <h1>adfasdfasd</h1> {% load mytags %} {% my_inclusion 10 %} {% endblock %}