day62 Pyhton 框架Django 05
内容回顾 1.变量 render(request,'模板文件名',{ k1:v1 }) {{ k1 }} {{ list.0 }} {{ dict.key }} {{ dict.keys }} {{ dict.values }} {{ p1 }} {{ p1.name }} {{ p1.eat }} 2.过滤器 {{ value|filter }} {{ value|filter:参数 }} 内置的过滤器: default 默认值 {{ value|default:’nothing‘}} title add slice {{ value|slice:’1:2:2‘}} length 长度 filesizesformat first last date {{ now|date:'Y-m-d H:i:s' }} safe 不做转义 3.tags {% %} {% for i in list %} {{ forloop }} {{ i }} {% endfor %} {% for i in list %} {{ i }} {% empty %} 空空如也 {% endfor %} {% if 条件 %} {% elif 条件%} {% else %} {% endif %} 注意:1.不支持连续判断 1. 不支持算数运算 + - * / 4.母板和继承 *** 定义母板: base.html 写一个HTML文件,提取多个页面的公共部分,在页面中定义block块。 继承: 写子页面,第一行写 {% extends 'base.html' %},重写block块。 注意的内容: 1. {% extends 'base.html' %} 写在第一行 'base.html'加上引号 2. 要修改的内容写在block块中 3. 多写点block块 css js 5.组件 组件:一小段写死的HTML代码 使用:{% include ’nav.html‘ %} 6.csrf_token 将{% csrf_tonken %}写在from表中,name=csrfmiddlewaretoken 今日内容: 1.装饰器 装饰器:在不改变原函数的代号和调用方法的基础上,给原函数额外增加工功能。 def warpper(func): def inner(*args,**kwargs): # 原函数执行之前的操作 ret = func(*args,**kwargs) # 原函数执行之后的操作 return ret return inner @warpper # xxx = warpper(xxx) def xxx(*args,**kwargs): xxx(*args,**kwargs) 带参数的装饰器: def outer(flag): def timer(func): def inner(*args, **kwargs): ret = func(*args, **kwargs) if flag: print(time.time()) return ret return inner return timer 多个装饰器装饰一个函数: def wrapper1(func): def inner(*args, **kwargs): print('wrapper1 前') ret = func(*args, **kwargs) print('wrapper1 后') return ret return inner def wrapper2(func): def inner(*args, **kwargs): print('wrapper2 前') ret = func(*args, **kwargs) print('wrapper2 后') return ret return inner @wrapper2 # func1 =wrapper2(func1) wrapper2.inner @wrapper1 # func1 =wrapper1(func1) wrapper1.inner def func1(): print('func1') 装饰器的修复技术 from functools import wraps def w1(func): @wraps(func) def inner(*args, **kwargs): print('wrapper1 前') ret = func(*args, **kwargs) print('wrapper1 后') return ret return inner 2.自定义的方法 自定义filter 定义 1. 在app下创建一个名叫templatetags的python包 2. 在包内创建py文件 3. 在py文件中写: from django import template register = template.Library() 4. 写函数 def add_sb(value, arg): return '{}_{}_sb'.format(value, arg) 5. 给函数加装饰器 @register.filter def add_sb(value, arg): 使用: {% load my_tags %} {{ 'alex'|add_sb:'very' }} {% if 'alex'|add_sb:'big' == 'alex_big_sb' %} zhen {% endif %} 自定义simple_tag 定义: 前3步同上 1. 写函数(函数参数不受限制),加装饰器 @register.simple_tag def str_join(*args, **kwargs): print(args) print(kwargs) return "-".join(args) + '*'.join(kwargs.values()) 使用: {% load my_tags %} {% str_join 'k1' 'k2' 'k3' k1='v1' k2='v2' %} 自定义inclusion_tag 返回一个动态的代码段 定义: 前3步同上 1. 写函数加装饰器 @register.inclusion_tag('li.html') def show_li(num): return {'num': range(num)} 1. 写模板(li.html) <ul> {% for foo in num %} <li> {{ foo }}</li> {% endfor %} </ul> 使用: {% load my_tags %} {% show_li 10 %} 3.静态文件相关 {% load static %} <link rel="stylesheet" href="{% static 'plugins/bootstrap-3.3.7/css/bootstrap.css' %}"> <link rel="stylesheet" href="{% static 'css/dsb.css' %}"> {% get_static_prefix %} 获取静态文件的别名