1.模板系统的语法
引用变量数据: {{ }}
标签逻辑操作:{%...%}
2.变量
变量名由字符数字下划线组成 ,可以执行由视图函数传过来的对象的方法和属性 ,但是视图函数中如果使用 ' . ' 执行对象的方法无法传参
#views.py
def test(request):
lst = []
dit = {}
class person:
def __init__(self, name, age):
self.name = name
self.age = age
def echo(self):
return '{}*{}岁'.format(self.name, self.age)
def __repr__(self):
return self.name
p1 = person('qgw', 12)
p2 = person('gwq', 15)
lst.append(p1)
lst.append(p2)
dit['p1'] = p1
dit['p2'] = p2
return render(request, 'test-n.html', {'l': lst, 'd': dit,'p1':p1})
#模板语法 ,不能使用括号() ,所以无法传参 列表 {# 取列表中的第一个参数,与后端索引类似 #} {{ l.0 }} 字典 如果有键是keys ,那么优先级为先找键 ,再去找属性方法 {# 根据字典的key取值 #} {{ d.name }} {# 字典的方法items取出kv对 ,keys取出所有的k ,values取出所有的v #} {{ d.items }} {{ d.keys }} {{ d.values }} 对象相关 {# 友好打印列表,返回一堆内存地址,这个调用了__repr__方法 ,重构repr即可 #} {{ p1 }} {# 取对象的name属性 #} {{ p1.name }} {# .操作只能调用不带参数的方法 #} {{ p1.echo}}
3. 变量二次处理
变量可以使用管道做二次处理 ,过滤器是一些已经定义好的处理方法 ,管道可以有多个处理多次
语法: {{ 变量|filter_name:参数 }}
default #给变量设置默认值
add #把变量拼接与参数
length #把变量的长度打印出来 ,不能对int类型操作
slice #切片
first #第一个元素
last #最后一个元素
date #将日期格式化
truncatechars #保留指定长度字符串 ,后续变为...
safe #如果是代码 ,不加safe默认是不执行的 ,以字符串显示 ,加了这个就可以执行
4.标签逻辑操作
常用逻辑有 for if with csrf_token url ,可以使用tab键补全格式
1) for循环
for循环内部可以使用的一些方法
forloop.counter #打印本次循环是第几次
forloop.counter0 #打印本次循环是第几次(从0开始)
forloop.revcounter #倒叙打印本次循环第几次
forloop.revcounter0 #倒叙打印本次循环第几次(从0开始)
forloop.first #如果是第一次循环 ,返回true
forloop.last #如果是最后一次循环, 返回false
forloop.parentloop #打印外层循环 (多层循环使用) ,可以在子循环中使用父循环的forloop的方法
empty #当整个for循环中empty以上代码没有生成 ,则执行empty下面的代码
{% extends 'base.html' %} {% block body1 %} <table class="table table-bordered"> {% for objlst in data %} {% for obj in objlst %} <tr> {#将外层循环第一次的内容加上info颜色#} <td {% if forloop.parentloop.first %}class='info'{% endif %}>{{ obj.name }}</td> <td>{{ obj.age }}</td> <td>{{ forloop.counter }}</td> </tr> {% endfor %} {% empty %} <h1>isnone</h1> {% endfor %} </table> {% endblock %}
2)if判断
if运用比较灵活可以写在一个标签中 ,控制标签的属性 如: "<td {% if forloop.parentloop.first %}class='info'{% endif %}>{{ obj.name }}</td>"
{% extends 'base.html' %} {% block body1 %} {% if 10 >= 9|add:2 %} #add是加法和减法 <h2>1</h2> {% else %} <h2>2</h2> {% endif %} {% endblock %}
3)with别名
with别名区域 ,在指定区域中一个变量可以通过别名方式引用
{% extends 'base.html' %} {% block body1 %} {{ zheshiyige_obj.name }} {#别名方式#} {% with zheshiyige_obj as obj %} {{ obj.name }} {% endwith %} {% endblock %}
5.模板与继承
模板: 就是一个普通的html页面 ,但是是公共部分 ,有效避免代码重复 ,写多个不同的block块 ,子页面中逻辑的内容放入block中 ,通常css和js的引用也会设计一个block
子页面继承模板方法 :
页面第一行{% extends '模板.html' %}
{% block 块名 %}
{% endblock %}
6.组件
组件也是避免代码重复 ,是一小块代码 ,需要给很多页面使用
组件使用 {% include 'html页面' %}
#zj.html <h2>这里是oooo</h2> #其他页面引用 {% include 'zj.html' %}
7.静态文件配置名
和路有别名作用差不多 ,为了防止static静态目录名的变更 ,我们将静态目录起个别名放在settings中 ,所有模板中引用静态文件的时候 ,直接使用静态文件别名或相对路径即可
#settings.py STATICFILES_DIRS = [ os.path.join(BASE_DIR, 'static') #指定静态文件的根目录 ] #html页面引用静态文件 {% load static %} #导入静态文件 {% static '相对路径文件名' %} #引用静态文件