注意:
1,模板层语言注释:前端看不到
2,相当于Print了该变量
3,只写函数名,在模板里面相当于执行该函数
4,模板中不能调用有参函数的方法
5,深入查询:统一要用句点符
一,变量
在模板中
<!DOCTYPE html> <html lang="zh"> <head> <meta charset="UTF-8"> <title>模板层</title> </head> <body> <h1>模板层</h1> <hr> <h2>模板语言之变量</h2> <p>字符串:{{ name }}</p> <p>数字:{{ age }}</p> <p>列表{{ li }}</p> <p>元组:{{ tu }}</p> <p>字典:{{ dic }}</p> {# 只写函数名,相当于执行该函数#} <p>函数:{{ test }}</p> {# 如果只写对象名,则显示的是对象的内存地址#} <p>对象: {{ lqz }}</p> <p>列表套对象:{{ person_list }}</p> <p>字典套对象:{{ person_dic }}</p> <hr> <h2>深度查询</h2> <p>列表的第0个值</p> <p>列表第3个值:{{ ll.3 }}</p> <p>字典取值:{{ dic.name }}</p> <p>字典取列表值:{{ dic.ll }}</p> {# 想要继续取值,则继续往下点就好了#} <p>对象取数据属性:{{ lqz.name }}</p> <p>对象取绑定给对象的函数属性:{{ lqz.get_name }}</p> <p>对象取绑定给类的函数属性:{{ lqz.cls_test }}</p> <p>对象取静态方法:{{ lqz.static_test }}</p> <p>把对象列表中egon年龄取出来:{{ person_list.1.age }}</p> <h2>字符串的方法(了解)</h2> <hr> <p>字符串的方法:{{ name.upper }}</p> <hr> </body> </html>
在视图中设置
from django.shortcuts import render, HttpResponse, redirect from django.http import JsonResponse # Create your views here. # def index(request): # l = [{'name': 'lqz', '年龄': 18}, {'姓名': 'lqz2', 'age': 18}] # return JsonResponse(l, safe=False, json_dumps_params={'ensure_ascii': False}) def index(request): name = 'jack' age = '20' l1 = [1, 2, 'lily'] ll2 = [] dic2 = {} tu = (1, 2, 3) dic = {'name': 'lqz', 'age': 18, 'll': [1, 2, 4]} # 函数 def test(): print('执行此函数') return 'test 的返回值' # 类和对象 class Person(): def __init__(self, name, age): self.name = name self.age = age def get_name(self): return '类Person中的get_name方法的返回值' @classmethod def cls_test(cls): return '类Person中的cla_test方法的返回值' @staticmethod def static_test(): return '类Person中的static_test方法的返回值' # 模板中不可以执行带参数的方法 def get_name_cs(self, tt): return self.name lqz = Person('lqz', 18) egon = Person('egon', 18) person_list = [lqz, egon] person_dic = {'lqz': lqz} file_size = 1024 import datetime ctim = datetime.datetime.now() h1 = '<h1>你好</h1>' # 导入这个之后,直接把文本转换成html文件可以解析的语句 # 导入from django.utils.safestring import mark_safe # h1 = mark_safe(h1) script = '<script>alert(111)</script>' # user='lqz' user = '' return render(request, 'index.html', locals())
二,过滤器
语法:{{ 第一个参数|过滤器名字:第二个参数 }}
<h1>模板语言之过滤器</h1> {#后面就是个python中的函数,|前面的,是函数的第一个参数,冒号后面的是第二个参数#} <p>统计字符串长度:{{ name|length }}</p> <p>统计列表长度:{{ ll|length }}</p> {# 当前面的列表或者字符串为空的时候才能返回设置的默认值 #} <p>过滤器之默认值:{{ ll2|default:'没有值' }}</p> {# filesizeformat把前面的数值转换成可读的单位,一般字符串里面也是数值 #} <p> 过滤器之filesizeformat--1:{{ 2013344444444444444444444445555444444444444444444444444444444444444444444444444444444444443|filesizeformat }}</p> <p>过滤器之filesizeformat--2:{{ file_size|filesizeformat }}</p> {# ctim是把后台传过来的数据,完整的打印在页面上面,使用data之后,就把ctim时间规范成后面自定义的格式 #} <p>过滤器之不使用date:{{ ctim }}</p> <p>过滤器之date:{{ ctim|date:'Y-m-d' }}</p> {#前闭后开区间#} <p>过滤器之slice:{{ ll|slice:'2:-1' }}</p> {#支持步长#} <p>过滤器之slice-字符串:{{ name|slice:'0:3:3' }}</p> {#三个起步,显示da...#} <p>过滤器之truncatechars:{{ 'dafddfafgadfgaasdgadgfadaf'|truncatechars:5 }}</p> {# 这个显示从开始数五个单词... #} <p>过滤器之truncatewords:{{ '我 dfaf ga dfgaas 你 dgf adaf'|truncatewords:5 }}</p> {# 不加safe,django不会解析后台的数据,直接输出,加了safe之后,页面可以解析后台的数据比如:<h1></h1> #} <p>过滤器之不用safe:{{ h1 }}</p> <p>过滤器之用safe:{{ h1|safe }}</p> <p>过滤器之不用safe:{{ script }}</p> {#<p>过滤器之用safe:{{ script|safe }}</p>#} {# add把传入的两个整数进行相加,传入的两个字符串进行拼接 #} <p>过滤器之用add:{{ 12|add:'1' }}</p> <p>过滤器之用add:{{ 'egon'|add:'dsb' }}</p>
三,标签
for循环标签 if条件标签 with是重命名标签
<h2>模板语言之标签</h2> {% for foo in ll %} {{ forloop }} {# forloop里面的值,具体如下 #} {# parentloop:for循环父级的这些全部内容,counter0:从0开始计数,counter:从1开始计数,revcounter:倒着计数,末尾为1,revcounter0:倒着计数,末尾为0 #} <p>{{ forloop.first }}--->{{ forloop.counter0 }}--->{{ forloop.revcounter }}----->{{ foo }}</p> {% endfor %} {% for foo in ll %} {% for i in person_list %} 取出外层是第几次循环 {{ forloop.parentloop.counter }} <p>{{ forloop.first }}--->{{ forloop.counter0 }}--->{{ forloop.revcounter }}----->{{ foo }}</p> {% endfor %} {% endfor %} **************循环的对象是空,才会走到empty,而不是对象里面的东西为空 {% for foo in dic2 %} <p>{{ foo }}</p> {% empty %} <p>傻逼了</p> {% endfor %} 只循环字典的话,取到的是key值 {#{% for foo in dic %}#} 取到value的值 {#{% for foo in dic.values %}#} 取到key 和 value的值 {# 当循环的是个空列表的时候,才执行empty函数 #} {% for k,foo in dic.items %} <p>{{ k }}----->{{ foo }}</p> {% empty %} 傻逼了 {% endfor %} {% if user %} <a href="">退出</a> {% else %} <a href="">登录</a> <a href="">注册</a> {% endif %} for循环判断如果是第一次,打印第一次,其他打印正常值 {% for foo in ll %} {% if forloop.first %} <p>第一个参数 </p> {% elif forloop.last %} <p>最后一个参数 </p> {% else %} <p>{{ foo }}</p> {% endif %} {% endfor %} <hr> {#with 相当于取别名,作用:变量太长,可以简化#} {#{% with name as ttt %}#} {# {{ ttt }}#} {# {{ name }}#} {# {{ user }}#} {##} {#{% endwith %}#} ------ {% with dic.ll.2 as ttt %} {{ ttt }} {{ ttt }} {% endwith %} ************************for ,if,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,确定app是否在setting中注册 2 在app下创建一个templatetags的文件夹(模块)(****名字不能变***) 3 在模块下创建一个py文件,名字随意:mytag.py 4 # 第一步,导入template from django.template import Library # 第二步,定义一个叫register的变量=template.Library() register = Library() 5 只是装饰器不一样 @register.simple_tag() def add_nb(value): return value+'nb' 6 在模板里:(多个参数,以空格区分) -{% load mytag %} -{% add_nb 'lqz'%}