Python学习笔记-Day61和Day62-Django模板系统
主要内容:
一、模板语言-变量
二、模板语言-过滤器
三、模板语言Tags
四、csrf-token
五、母板
六、组件
七、静态文件相关
八、自定义tag
一、Django模板语言-变量
1、语法:{{ 变量名 }}
2、命名规则:所有的数字、字母、下划线的自由组合
3、点(.)的作用
① 字典查询 {{ dic.key }}
② 属性、方法查询 {{ obj.name }}
③ 索引查询 {{ list1.0 }}
二、Django模板语言-过滤器filter
过滤器的作用是改变变量的显示
1、语法:{{ 变量|filter_name:'参数' }}
① 过滤器支持链式操作,一个过滤器的输出可以作为另一个过滤器的输入
② 过滤器可以要接收参数
③ 过滤器中的参数是空格的话要用引号包起来
④ 管道符|左右两边没有空格
2、Django中提供的内置的过滤器大概有60多中,列举以下几种
① default
如果一个变量是false或空,就设置成默认的值
{{ value|default:"nothing" }}
② length
返回变量的长度,作用于字符串和列表
{{ value|length }}
③ filesizeformat
将值格式化成一个“人类可读”的文件尺寸
{{ value|filesizeformat }}
如果value的值是123456789,输出的将是117.7MB
④ slice
切片,和python中的切片是一样的,顾头不顾尾
{{ value|slice:"1:-1"}}
⑤ date ******
格式化时间
将一个datetime格式的时间格式化成我们想要的格式
{{ now|date:"Y-m-d H:i:s"}}
⑥ safe
为了安全,Django的模板中会对HTML标签和JS等语法标签自动转义成普通的字符串。
但有时,我们不需要这些字符串被转义,就可以通过safe过滤器告诉Django这段代码是安全的不需要转义
value = ‘<a href="#">点我</a>’
{{ value|safe }}
⑦ truncatechars
如果字符串中的字符多于指定的数量,那么会被截断,截断的字符将以可翻译的省略号序列(...)结尾,每个省略号代表一个字符
{{ value|truncatechars:9}} # 包括三个省略号在内,保留9个字符
⑧ truncatewords
按照空格进行截断,因为中文不以空格作为单词的分割,所以这个过滤器对中文没有什么用处
被截断的部分会以省略号(...)结尾
⑨ cut
移除掉指定的字符
{{ value|cut:'a'}}
移除掉value中的a字符
⑩ join
使用字符串连接列表,和python中的join一样
{{ list|join:'&'}}
⒒ timesince
{{ 以前的时间|timesince:之后的时间}}
计算之前的时间和之后的时间的时间差,如果参数省略,就是计算以前的时间和现在的时间差
最小的单位是分钟,如果以前的时间>之后的时间,返回“0分钟”
⒓ timeutil
{{ 以后的时间|timeutil:之前的时间}}
于timesince类似,计算以后的时间和之前的时间差
三、自定义过滤器
自定义过滤器只是一个带一个或两个参数的Python函数
例如过滤器{{ value|foo:"bar" }}是将value和bar作为参数传递给foo,bar这个参数可以省略
1、自定义filter的步骤
① 在app下新建一个Python package 名叫templatetags(一定要叫这个名)
② 在templatetags下新建一个py文件(名字随便取)my_filter.py
③ 在py文件中写函数,实现自定义的filter功能
④ 告诉Django框架多了一个自定义的filter
from django import template
register = template.Library()
@register.filter(name='调用时使用的filter名字,可以和函数名不一样')
def cut(value,arg):
return value.replace(arg, '')
2、使用自定义的filter
① 在HTML文件中导入py文件
{% load my_filter %}
② 重启Django项目
③ 按照普通的使用filter的方法调用
四、Tags(for、if、with)
1、for循环
① 普通的for循环
{% for user in user_list %}
{% endfor %}
for循环可用的一些参数
forloop.counter 当前循环的索引值(从1开始)
forloop.counter0 当前循环的索引值(从0开始)
forloop.revcounter 当前循环的倒序索引值(从1开始)
forloop.revcounter0 当前循环的倒序索引值(从0开始)
forloop.first 判断当前循环是不是第一次循环(布尔值)
forloop.last 判断当前循环是不是最后一次循环(布尔值)
forloop.parentloop 本层循环的外层循环的索引值
② for...empty
{% for user in user_list %}
{% empty %} # 如果user为空
{% endfor %}
2、if、elif、else
{% if 条件 %}
{% elif 条件 %}
{% else %}
{% endif %}
if语句支持and、or、==、>=、<=、!=、in、not in、is not判断,但是不支持联级判断
例如:不支持 if a>b>c
3、with
定义一个中间变量
使用方法1:用as
{% with business.employ.count as total%}
{{ total }}employee{{ total|pluralize }}
{% endwith %}
使用方法2:用等号
{% with total=business.employ.count %} # 等号两边没有空格
{{ total }}employee{{ total|pluralize }}
{% endwith %}
五、csrf_token
用于防止跨站请求伪造。
在form表单中加入{% csrf_token %}
相当于在form表单中嵌入一个隐藏的input框,里面有Django发送的随机的字符串,Django在接收表单中的内容的时候,会通过这个字符串检测这个网站是不是由我的服务器发给你的
六、母板
1、什么情况下使用母板
当多个页面的大部分内容都一样的时候,我们可以把相同的部分提取出来,放到一个单独的母板文件中
2、如何使用母板
① 在母板文件中定义要被替换的块(block)
{% block block_name %}
{% endblock %}
② 在子页面中
先继承母板 {% extend "母板.html" %}
填充block
{% block block_name %}
html内容...
{% endblock %}
七、组件
1、什么时候使用组件
页面上相对独立的某个部分可以单独拿出来放到一个单独的html文件中
2、如何使用
在需要这个组件的地方调用 {% include "组件.html"%}
八、静态文件相关{% load static %}
1、为什么要使用静态文件相关
因为当需要修改静态文件名的时候,需要将项目内所有引用静态文件的的地方都修改,工作量巨大,不如一开始就使用静态文件相关进行引用
2、引用方法
① 使用 static
{% load static %}
<link rel="stylesheet" href="{% static 'css/my_css.css'%}">
② 使用get_static_prefix
{% load static %}
<link rel="stylesheet" href="{% get_static_prefix%}css/my_css.css">
九、自定义tag
和自定义filter相同,只不过接收更灵活的参数
1、自定义的simple_tag
① 定义
在app下的templatetags文件夹下新建一个py文件(和自定义filter相同,可以使用自定义filter创建的py文件)
@register.simple_tag(name='plus')
def plus(a,b,c):
return '{}+{}+{}'.format(a,b,c)
②使用
{% load py文件名 %}
{% plus 1 2 "a" %}
2、自定义的include_tag
多用于返回html代码
例如:展示不固定页数的分页
① 定义
@register.inclusion_tag("nav.html") # nav.html是要渲染的组件的html文件
def page(num):
data = [i for i in range(1, num+1)]
return {"data":data} # 相当于render的作用
② 在nav.html文件中有接收data参数的地方
③ 在要展示的页面中导入py文件,直接使用自定义的inclusion_tag
{% load py文件名%}
{% page 5%} # 可以不需要导入组件,inclusion_tag中的return已经帮我们导入了