templates 该目录本身没有,如果我们需要使用,需要我们自己创建,该目录名通常为templates
1、创建位置:
1.直接在应用下创建该目录,应用下的html模板,能直接在应用下的views中使用,一般也只给自己的应用使用
2.直接在项目下创建该目录,在项目下创建的改目录,所有的应用中的views都可以方便的使用
3.若果是项目下的templates目录,需要配置才可以使用
配置:1.在setting的TEMPLATES中配置
'DIRS': [os.path.join(BASE_DIR,'templates')],
2.项目不能识别templates为模板目录,需要将该目录标记成模板目录才可以使用
标记: templates目录右键 ---- mark Directory as ---- template Folder看到目录变成紫色即可
注:如果遇到template不能识别,重新做以上操作
2、模板语法
1、变量
1.变量通常在views中定义,然后传递给模板,模板中直接使用就可以
2.使用变量: {{ 变量名 }} 用两个大括号括起来
3.注意: 如果模板板中的变量没有定义就使用了, 模板不会报错,当作空使用
2、语法
1、“.”语法
1.1、 . 可以用来调用属性
格式: 对象名.属性名
1.2.、. 可以用来调用方法
格式: 对象名.方法名 注意不加()
1.3、如果. 用在集合(list,tuple...)的 后面,可以连接索引, 可以获取索引位置的值
格式: 集合.索引 相当于python的: 集合[索引]
1.4、如果 . 用在字典的后面, 可以连接 可以,可以获取key对应的值
格式: 字典.key 相当于python的: 字典[key]
2、for语句
2.1、for 循环
{% for 变量名 in 集合名%}
循环体
{% endfor %}
2.2、
{% for 变量名 in 集合名 %}
循环体
{% empty %}
如果集合为空,应该显示的内容
{% endfor %}
2.3、forloop 循环的技术器
forloop.counter 从1开始计数
forloop.counter0 从0开始计数
forloop.first 是否是第一个数据
forloop.last 是否是最后一个数据
forloop.revcounter 从1开始计数, 倒着计数,即最大数是第一个
forloop.revcounter0 从0开始计数, 倒着计数,即最大数是第一个
3、判断语句
3.1、if语句
{% if 判断表达式1 %}
如果满足条件1就执行表达式1
{% elif 判断表达式2 %}
如果满足条件2就执行表达式2
{% else %}
否则执行表达式3
{% endif %}
注:elif与else可以省略
3.2、判断2个值是否相等
{% ifequal valu1 value2 %}
如果value1 等于value2执行表达式
{% endifequal %}
注意: 当value1与value2值相等,且类型也一样的时候才成立
3.3、比较运算符
> < >= <= == !=
比较运算符可用在if语句中作判断使用
4、运算方法
4.1、加法/减法 {% 值1|add值2 %} 值1 + 值2 注:当值2为负数时,即为减法
4.2、乘法/除法 {% widthratio value 分母 分子 %} 注:格式为: value * 分子 / 分母
4.3、整除 格式:{{ value|divisibleby:值 }} value是否能整除 值
4.4、大小写转换
转换成小写:{{ value|lower }}
转换成大写:{{ value|upper }}
4.5、字符串拼接: {{ 集合|join:"拼接的字符" }}
5、转义字符
5.1、在模板中 使用{{ 变量|safe }} 是得变量的字符串中的html标签生效
5.2、使用 autoescape
① {% autoescape on %}
{# 这里面的内容就是不生效的HTML字符串#}
{{ strHtml }}
{% endautoescape %}
② {% autoescape off %}
{# 这里面的内容就是可以生效的HTML字符串#}
{{ 变量 }} {% endautoescape %}
6、模板的继承
6.1、继承
在子模板首行写入{% extends '父模板路基' %} ,即可继承父模板
例:
6.2、在父模板中为子模板预留位置
6.2.1、在父模板中预留位置
在需要填充子模板内容的地方 写上 :
{% block 坑的名字 %}
父模板可在此写入内容
{% endblock %}
6.2.2、在子模板中将数据填入预留的位置
{% block 坑的名字 %}
填充的内容
{% endblock %}
注:子模板填充内容会将父模板的内容覆盖
6.2.3、在子模板填充内容的同时希望保留父模板的内容
在填充内容的首行加上 {{ block.super }}
例:{% block head %}
{{ block.super }}
<h1>xxxx</h1>
{% endblock %}
6.3、将多个分散的html使用include合并成一个完整的html
格式:{% include 'html文件' %}
例:将head.html、body.html、foot.html三个html文件合并
head.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
这是头
</body>
</html>
bady.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<div style="height: 200px; width: 200px; background: pink">
身子
</div>
</body>
</html>
foot.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
这是臭脚丫子
</body>
</html>
将三者合并:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
{# 将零散的html拼接成一个完整的html #}
{% include 'head.html' %}
{% include 'bannar.html' %}
{% include 'foot.html' %}
</body>
</html>
效果图:
7、模板的简单加载原理
模板的加载过程
def loadTem(request):
# 7.1、先将模板加载到views函数中
template = loader.get_template("HTML文件")
# 7.2、把数据给模板,并转换成html形式的字符串
htmlData = template.render(context={"content":"内容xxxxxx"})
# 7.3、把数据作为相应体,给客户端 html本质就是字符串
return HttpResponse(htmlData)