【一】模板语法的传取值
- 模板语法需要记两组符号,分别是
{{}}
和{% %}
{{}}
通常是与变量相关的
{% %}
通常是与逻辑相关的
【1】传值
- 模板语法可以传递python所有的数据类型,包括函数和类,以及类实例化的对象
- 传递函数的时候,函数需要有返回值,要不然在页面显示的结果就是None
- 模板语法会自动把所有能加括号调用的对象全部加括号调用,通常指代函数和类
- 要注意的是,django模板语法并不支持带形参的函数,如果带了形参,返回的结果永远都是None
【2】取值
- 在模板语法中,取值是通过句点符的形式取值的
- 可以点索引,也可以点键值,也可以连续连
## views.py
class Test(View):
def get(self, request):
s = 'green'
num_int = 18
num_float = 18.88
boolean = True
l1 = [1, 2, 3, 4, 5, 6, '列表']
dic = {'name': 'green', 'age': 18, 'hobby': ['洗脚', '搓背']}
tup = (1, 2, 3, '元组')
set_1 = {1, 2, 3, '集合'}
class Obj:
def one(self):
...
def two(self):
return 'two'
def __str__(self):
return '我被输出了'
obj = Obj()
return render(request, 'test.html', locals())
def post(self):
return HttpResponse('Tsst OK')
## html
<p>{{ s }}</p>
<p>{{ num_int }}</p>
<p>{{ num_float }}</p>
<p>{{ l1.6 }}</p>
<p>{{ dic.hobby.1 }}</p>
<p>{{ tup }}</p>
<p>{{ set_1 }}</p>
<p>{{ boolean }}</p>
<p>{{ func }}</p>
<p>{{ obj.one }}</p>
<p>{{ obj.two }}</p>
<p>{{ Obj }}</p>
【二】过滤器
【1】过滤器语法
- 在模板语法中,过滤器相当于传到页面的值的方法
- 过滤器的语法为 ,最多只能接收两个参数
{{value|filter_name:参数}}
【2】过滤器介绍
## 计算长度,计算value值的长度
{{ value|length }}
## 设置默认值,如果value的布尔值是True就输出value 反之则输出默认值
{{ value|default:'啥也不是' }}
## 计算文件大小,根据value值的数据计算文件大小
{{ value|filesizeformat }}
## 转换时间格式
{{ current_time|date:'Y-m-d H:m:s ' }}
## 切片操作 冒号后面的三个数字分别指代 起始位置,结束位置,步长,顾头不顾尾
{{ l1|slice:'0:3:2' }}
## 切取摘要,如果字符串字符多于指定的字符数量,那么会被截断,后面的会以...结尾
{{ value|truncatechars:9}}
## 移除指定字符
{{ value|cut:' ' }}
## 拼接字符(join)
{{ value|join:'NB' }}
## 加法(add)
{{ value|add:11 }}
## 取消转义,默认传来的字符是不识别标签的,需要取消转义才能识别
{{ value|safe }}
【三】标签
【1】for循环
## 普通for循环
<ul>
{% for user in user_list %}
<li>{{ user.name }}</li>
{% endfor %}
</ul>
## for循环可用的一些参数
{% for item in l1 %}
<p>当前循环的所有值(从1开始){{ forloop.counter }}</p>
<p>当前循环的所有值(从0开始){{ forloop.counter0 }}</p>
<p>当前循环的倒序索引值(从1开始){{ forloop.revcounter }}</p>
<p>当前循环的倒序索引值(从0开始){{ forloop.revcounter0 }}</p>
<p>判断当前是否是第一次循环{{ forloop.first }}</p>
<p>判断当前是否是最后一次循环{{ forloop.last }}</p>
<p>本层循环的外层循环{{ forloop.parentloop }}</p>
{% endfor %}
## empty for循环,{% empty %}通常是用在{% for %}或者{% if %}语句中的一个部分,用来指定在迭代或条件判断为空时的操作。
{% for item in items %}
{{ item }}
{% empty %}
<p>No items available.</p>
{% endfor %}
【2】if判断
- 跟python的if elif else 用法很像
## if ~ elif ~ else
{% if user_list %}
用户人数:{{ user_list|length }}
{% elif black_list %}
黑名单数:{{ black_list|length }}
{% else %}
没有用户
{% endif %}
【3】with语法
- 用于当一个变量需要多次引用,且表达式很复杂时,可以给该变量取一个别名
{% with business.employees.count as total %}
{{ total }} employee{{ total|pluralize }}
{% endwith %}
【4】csrf_token
- 这个标签用于跨站请求伪造保护。
- 在页面的form表单里面写上
【四】模板的继承
【1】模板
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="x-ua-compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Title</title>
{% block page-css %}
{% endblock %}
</head>
<body>
<h1>这是母板的标题</h1>
{% block page-main %}
{% endblock %}
<h1>母板底部内容</h1>
{% block page-js %}
{% endblock %}
</body>
</html>
【2】继承模板
{% extends 'father.html' %}
【3】块(block)
- 在父模板中用
{% block xxx%}
来定义块,声名这一块内容是可以让其他页面修改的
- 子页面通过定义模板中的block名来修改模板对应的内容
{% block page-main %}
<p>我是你爹</p>
<p>你是我儿</p>
<p>儿子你好</p>
{% endblock %}
【4】组件
- 可以将常用的页面内容如导航条,页尾信息等组件保存在单独的文件中,然后在需要使用的地方按如下语法导入即可。
{% include 'navbar.html' %}
【五】静态文件加载
【1】
## 加载Django静态文件
{% load static %}
<img src="{% static "images/hi.jpg" %}" alt="Hi!" />
## 引用js文件
{% load static %}
<script src="{% static "mytest.js" %}"></script>
## 某个文件多处被用到可以存为一个变量
{% load static %}
{% static "images/hi.jpg" as myphoto %}
<img src="{{ myphoto }}"></img>
【2】
- 相当于获取到了 static 文件夹的文件夹绝对路径,从绝对路径再往下找静态文