07_模板层

2019-04-13 14:46发布

#模板层

一、模版语法之变量

1、变量的直接使用

使用方法:{{ 变量名 }}
# views.py def index(request): name = 'lqz' age = 18 ll = [1, 2, 'lqz', 'egon'] ll2=[] dic2={} tu = (1, 2, 3) dic = {'name': 'lqz', 'age': 18, 'll': [1, 2, 4]}
index.html:

模板语言之变量

字符串:{{ name }}

数字:{{ age }}

列表:{{ ll }}

元祖:{{ tu }}

字典:{{ dic }}

2、函数及类的使用:

# views.py def index(request): # 函数 def test(): print('lqz') return 'zhouxiang dsb' # 类 class Person(): def __init__(self, name, age): self.name = name self.age = age def get_name(self): return self.name @classmethod def cls_test(cls): return 'cls' @staticmethod def static_test(): return 'static' # 模板里不支持带参数 def get_name_cs(self,ttt): return self.name lqz=Person('lqz',18) egon=Person('egon',18) person_list=[lqz,egon] person_dic={'lqz':lqz}
index.html:
{# 只写函数名:相当于函数名(),执行该函数 #}

函数:{{ test }}

{# 对象内存地址 #}

对象:{{ lqz }}

列表套对象:{{ person_list }}

字典套对象:{{ person_dic }}

3、深度查询:

index.html:

深度查询

列表第0个值:{{ ll.0 }}

列表第3个值:{{ ll.3 }}

字典取值:{{ dic.name }}

字典取列表值:{{ dic.ll }}

{# 再继续取值,继续点 #}

对象取数据属性:{{ lqz.name }}

对象取绑定给对象的函数属性:{{ lqz.get_name }}

对象取绑定给类的函数属性:{{ lqz.cls_test }}

对象取静态方法:{{ lqz.static_test }}

把对象列表中egon年龄取出来:{{ person_list.1.age }}

{# 拓展:不能调有参数的方法 #} {# 注意:句点符也可以用来引用对象的方法(无参数方法) #}

字符串的方法:{{ name.upper }}

二、模板之过滤器

语法:{{第一个参数|过滤器名字:第二个参数}}
{{obj|filter__name:param}} 变量名字|过滤器名称:变量
常见过滤器:
default:(默认值) # 如果一个变量是false或者为空,使用给定的默认值。否则,使用变量的值。例如: {{ value|default:"nothing" }} length:(长度) # 返回值的长度。它对字符串和列表都起作用。例如: {{ value|length }} # ps:value = ['a', 'b', 'c', 'd'] ,那么输出是 4 filesizeformat: # 将值格式化为一个 “人类可读的” 文件尺寸 (例如 '13 KB', '4.1 MB', '102 bytes', 等等)。例如: {{ value|filesizeformat }} # 如果 value 是 123456789,输出将会是 117.7 MB。   date:(时间) # 如果 value = datetime.datetime.now() {{ value|date:"Y-m-d" }} slice:(切片) # 如果 value="hello world" {{ value|slice:"2:-1" }} truncatechars: 参数 3 以上 # 如果字符串字符多于指定的字符数量,那么会被截断。截断的字符串将以可翻译的省略号序列(“...”)结尾。 # 参数:要截断的字符数,例如: {{ value|truncatechars:5 }} safe: Django的模板中会对HTML标签和JS等语法标签进行自动转义,原因显而易见,这样是为了安全。但是有的时候我们可能不希望这些HTML元素被转义,比如我们做一个内容管理系统,后台添加的文章中是经过修饰的,这些修饰可能是通过一个类似于FCKeditor编辑加注了HTML修饰符的文本,如果自动转义的话显示的就是保护HTML标签的源文件。为了在Django中关闭HTML的自动转义有两种方式,如果是一个单独的变量我们可以通过过滤器“|safe”的方式告诉Django这段代码是安全的不必转义。比如: # h1 = '

你好

'

过滤器之不用safe:{{ h1 }}

过滤器之用safe:{{ h1|safe }}

其它过滤器(了解)
13223354-87781e3815dc4cf9.jpg 过滤器_01.jpg 13223354-10d4b98f67721f00.jpg 过滤器_02.jpg 13223354-b996a08b99ccf1d8.jpg 过滤器_03.jpg 13223354-2793acba62f2b476.jpg 过滤器_04.jpg

三、模版之标签

语法:{% 标签 %}
for标签 forloop:对象(里面有好多东西:parentloop,last,first,counter....)忘记的话,自己打印一下 empty:被循环的对象是空,才走它 for循环可以嵌套,也可以用if # 遍历每一个元素: {% for person in person_list %}

{{ person.name }}

{% endfor %}
# for ... empty {% for person in person_list %}

{{ person.name }}

{% empty %}

sorry,no person here

{% endfor %}
if 标签 {% if %}会对一个变量求值,如果它的值是“True”(存在、不为空、且不是boolean类型的false值),对应的内容块会输出。 {% if num > 100 or num < 0 %}

无效

{% elif num > 80 and num < 100 %}

优秀

{% else %}

凑活吧

{% endif %}
if语句支持 and 、or、==、>、<、!=、<=、>=、in、not in、is、is not判断。
with :重命名,应用在变量名过长

四、自定义标签和过滤器

标签不能用在if判断,过滤器,可以用在if判断
自定义过滤器 -1 先app是不是已经在setting中注册 -2 在app下创建一个templatetags(****名字不能变***)的文件夹(模块) -3 在模块下创建一个py文件,名字随意:mytag.py -4 # 第一步,导入template from django.template import Library # 第二步,定义一个叫register的变量=template.Library() register = Library() -5 写一个函数,用@register.filter(name='yyy')装饰一下(可以指定别名) def str_add(str1, str2): #一定要有返回值 # 业务逻辑很复杂 return str1 + str2 -6 在模板里:(新定定义的标签,过滤器,都要重启程序) -{% load mytag %} -{{'lqz'|str_add:'nb'}} 自定义标签 -1-4:前4步,根过滤器的定义完全一样 -5 只是装饰器不一样 @register.simple_tag() def add_nb(value): return value+'nb' -6 在模板里:(多个参数,以空格区分) -{% load mytag %} -{% add_nb 'lqz'%}