1、templates用来放置模板文件
1、templates 该目录本身没有,如果我们需要使用,需要我们自己创建,该目录名通常为templates
2、创建位置:
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
看到目录变成紫色即可
4、如果遇到template不能识别,重新做以上操作
2、模板语法
1、变量
1、变量通常在views中定义,然后传递给模板,模板中直接使用就可以
2、使用的语法:{{变量名}} 用两个{}
3、注意:如果模板中的变量没有定义就使用了,模板不会报错,当作空使用
2、 . 语法
1、. 可以用来调用属性
格式:对象名.属性名
2、. 可以用来调用方法
格式:对象名.方法名 注意不加()
3、如果 . 用在集合(list,tuple...)的后面,可以连接索引,可以获取索引位置的值
格式:集合.索引 相当于python的:集合[索引]
4、如果 . 用来字典的后面,可以获取key对应的值
格式:字典.key 相当于python的:字典[key]
3、for循环
注意:有结束标签 {% endif %}
1、格式1:
{% for 变量名 in 集合名 %}
循环体
{% endfor %}
2、格式2:
{% for 变量名 in 集合名%}
循环体
{% empty %}
如果集合为空,应该显示的内容
{% endfor %}
3、forloop 循环的计数器
forloop.first 是否是第一个数据
forloop.last 是否是最后一个数据
forloop.counter 从1开始计数
forloop.counter0 从0开始计数
forloop.revcounter 从1开始计数,倒着计数,即最大数是第一个
forloop.revcounter0 从0开始计数,倒着计数,即最大数是第一个
4、判断语句
1、格式1:
{% if判断表达式 %}
如果满足条件就执行表达式
{% endif %}
2、格式2:
{% if判断表达式 %}
如果满足条件就执行表达式
{% else %}
否则执行表达式2
{% endif %}
3、格式3
{% if判断条件1 %}
如果满足条件1执行表达式1
{% elif判断表达式2 %}
如果满足条件2执行表达式2
{% else %}
否则执行表达式3
{% endif %}
4、格式4:判断两个值是否相等
{% ifequal value1 value2 %}
如果value1等于value2执行表达式
{% endifequal %}
注意:当value1与value2值相等,且类型也一样的时候才成立
5、格式5:判断两个值是否不相等
{% ifnotequal value1 value2 %}
如果value不等于value2执行表达式
{% endifnotequal %}
5、比较运算符
> 大于
< 小于
>= 大于等于
<= 小于等于
== 等于(类型也要一直)
!= 不等于
**表示范围的语法结果一般有结果标签,一般是{% %}
6、注释:
{# 这是模板语法中的单行注释 快捷键:ctrl + / #}
{% comment %}
这是多行注释 快捷键:ctrl+shift+/
{% endcomment %}
<!-- 这是HTML注释 -->
这种注释方法在控制台可见,一般不要使用
7、其他
1、加法/减法运算
加法:格式{{ value|add:值 }} value 值
减法:格式{{ value|add:值}} value -值
2、乘法/除法运算
格式:{% widthratio value 分母 分子%}
相当于 value * 分子/分母
除法 {% widthratio value 分母 1 %}
乘法 {% widthratio value 1 分子 %}
3、是否整除某个数
格式:{{ value|divisbleby:值 }} value是否能整除值
需求:隔行换色
{% for student in allStudent %}
{% if forloop.counter0|divisibleby:2 %}
<li style="color: red">{{ student.s_name }}</li>
{% else %}
<li style="color: green">{{ student.s_name }}</li>
{% endif %}
{% endfor %}
4、大小写转换
转换成小写:{{ value|lower }}
转换成大写:{{ value|upper }}
5、字符串拼接
字符串拼接:{{ 集合|join:'拼接的字符'}}
8、转义字符
问题:默认情况下,如果views视图函数传递给模板的是一个html格式的字符串,默认模板中的html标签不会生锈,而有时候需要html标签生效
使标签生效
使用 autoescape
这里面的内容就是不生效的HTML字符串
{% autoescape on %}
{{ strHtml }}
{% endautoescape %}
这里面的内容就是生效的HTML字符串
{% autoescape off %}
{{ strHtml }}
{% endautoescape %}
9、模板的继承
子模板可以继承一个父模板,即可以继承父模板的css/html/js
1、如何继承
1、定义一个父模板base.html,通常在父模板写一些通用的功能
2、定义一个子模板index.html,在子模板的首行写{% extends 'base.heml'%},就可以继承父模板中的所有css/html/js
2、block
在继承中可以block来在父模板中挖坑,挖坑可以给子类内容设置一个预留位置,方便子类在对应的位置填充内容
1、在父类中挖坑
在需要填充子模板内容的地方写上:
{% block 坑的名字 %}
{% ednblock%}
2、在子类中填坑
{% block 坑的名字 %}
填充内容
{% endblock %}
3、填坑保留父模板内容
可以在填坑的首行加上{{ block.super }}
如:{% block head %}
{{ block.super }}
<h1>这是三级头</h1>
{% ednblock %}
注意
可以挖多个坑
填坑的时候不需要按照顺序
没有填的坑,就是空内容
3、思想
1、化整为零
将一个完整的html用block划分成很多的小块,开发者只需要考虑填充对应的小模块即可
2、化零为整
将多个零散的html用include在一个html中包含进来,可以拼接成一个完整的html
将零散的html拼接成一个完整的html
{% include 'head.html' %}
{% include 'banner.html' %}
{% include 'foot.html' %}
10、模板的简单加载原理
模板的加载过程
def loadTem(request):
1、先将模板加载到views函数中
template = loader.get_template('loadTem.html')
2、把数据给模板,并转换成html形式的字符串
htmlData = template.render(context = {'content':'内容'})
3、把数据作为相应体,给客户端 html的本质就是字符串
return HttpResponse(htmlData)