1,在App中创建自己的templates
这个模板路径不用在settings中注册
2,在工程级目录中创建templates
需要配置模板路径
settings
模板路径是存在一个列表中
就是相对于注册模板路径的一个相对路径
{{ var }}
变量
遵循命名规范点语法
获取属性
调用方法,不能传递参数
{{ pet.p_name }}索引
{#代表索引拿出来,0表示第一条#}
{{ pets.0.p_age }}
{% csrf_token %}
{#只要在django里用post请求,就必须用这行代码#}
{% csrf_token %}使用中间件csrf_token
1. 增加系统安全性
2. 尽量不要关闭,在请求头的cookie中生成了验证口令
3.在请求的cookie中生成一个中间件,在表单中使用,并且用post请求
4. 默认django中集成了验证,使用的时候需要在表单中添加{% csrf_token %}
5. 关闭,在settings中的middleware中将csrf删除token
- 令牌,用来验证身份
- token只是一种验证规则
- 生成规则,(1)保证生成数据唯一,(2)用户唯一,拼接时间戳,拼接公司域名,工程名字,(md5(摘要)算法,)
- md5 本质是128位2进制,32个16进制,把16进制的字符转换成字符串,md5 都是32位,不管输入多长,输出都是一样长
for in
当列表为空或不存在时,执行empty之后的语句
{% for pet in pets %}
<li>{{ pet.p_name }}</li>
{% empty %}
<h3>你的宠物</h3>
{% endfor %}
forloop , counter索引,默认是1,需要定义counter0
{{ forloop.counter }} 从1数数
{{ forloop.counter0}}从0数数
{{ forloop.revcounter}}倒着数数,到1停
{{ forloop.revcounter0}},倒着数,到0停
{{ forloop.first }} 是否是第一个 布尔值
{{ forloop.last }} 是否是最后一个 布尔值
{% empty %}是否为空
{% for pet in pets %}
<li>{{ forloop.counter }}{{ pet.p_name }}</li>
{% endfor %}
{% for pet in pets %}
<li>{{ forloop.revcounter0}}{{ pet.p_name }}</li>
{% endfor %}
if else
{% if xxx %}
{% else %}
-------------------
{% if xxx %}
{% endif %}
--------------------
{% if xxx %}
{% elif xxx %}
{% endif %}
------------------
{% ifequal game1 game2 %}
<h2>你真是情投意合</h2>
{% endifequal %}
--------------------
<ul>
{% for pet in pets %}
{% if forloop.first %}
<li style="color: #ff0000">{{ pet.p_name }}</li>
{% elif forloop.last %}
<li style="color: #00ff00">{{ pet.p_name }}</li>
{% else %}
<li style="color: #00ffff">{{ pet.p_name }}</li>
{% endif %}
{% endfor %}
</ul>
网络安全转义
safe 网络安全
html转义渲染
开发中尽量保持纯文本
如果进行html渲染
可能会被其它人利用进行恶意注入
{% autoescape on/off %}
{% endautoescape %}HTML转义
将接收到的数据当成普通字符串处理还是当成HTML代码来渲染的一个问题,
把试图函数里的数据在HTML页面中渲染出代码的形式,这样做很危险,一般别用
开发尽量保持纯文本,如果进行HTML渲染,可能会被其他人利用进行恶意注入
1,在视图函数里面定义
def getw(request):
content = '<h1>你是垃圾</h1>'
return render(request,'welcome.html',context={'content':content})
2,在HTML页面里面渲染
渲染成html:
第一种转义
{{ code|safe}}
第二种转义
{% autoescape off%}
{{ content }}
{% endautoescape %}
不想渲染
{% autoescape on%}
code
{% endautoescape %}
挖坑
1, extends继承,写在开头位置,模板继承,
{% extends ‘父模板路径’ %}
创建基类模板
(1)导入统一资源JS CSS
(2)预留常用模板位置
(3)将页面结构设计好
继承基模板
根据页面需求进行数据填充
2, 挖坑,填坑
{% block content %}
code
{% endblock %}
首次出现,挖坑
子类模板出现的父类出现过的坑,填坑操作
填坑可以嵌套,没有填写的坑,在HTML中自动忽略
3, include: 解耦思想,将一个HTML页面拆分成多个模块,让代码更容易维护
{% include ‘模板文件’ %}
过滤器
系统中存在很多的过滤规则
运算
加减 add
乘除
withradio
num 分母 分子
整除
divisiableby
乘除,分子分母 ,1/5
<ul>
{% for pet in pets %}
<li>{% widthratio forloop.counter 1 5 %}</li>
{% endfor %}
</ul>
{# |过滤器 隔行变色#}
<ul>
{% for pet in pets %}
{% if forloop.counter|divisibleby:2 %}
<li style="color: #ffff00">{{ pet.p_name }}</li>
{% else %}
<li style="color: #00ff00">{{ pet.p_name }}</li>
{% endif %}
{% endfor %}
</ul>