模板
Django 模板查找机制: Django 查找模板的过程是在每个 app 的 templates 文件夹中找(而不只是当前 app 中的代码只在当前的 app 的 templates 文件夹中找)。各个 app 的 templates 形成一个文件夹列表,Django 遍历这个列表,一个个文件夹进行查找,当在某一个文件夹找到的时候就停止,所有的都遍历完了还找不到指定的模板的时候就是 Template Not Found (过程类似于Python找包)。这样设计有利当然也有弊,有利是的地方是一个app可以用另一个app的模板文件,弊是有可能会找错了。所以我们使用的时候在 templates 中建立一个 app 同名的文件夹,这样就好了。
这就需要把每个app中的 templates 文件夹中再建一个 app 的名称,仅和该app相关的模板放在 app/templates/app/ 目录下面,
例如:项目 zqxt 有两个 app,分别为 tutorial 和 tryit
zqxt
├── tutorial
│ ├── __init__.py
│ ├── admin.py
│ ├── models.py
│ ├── templates
│ │ └── tutorial
│ │ ├── index.html
│ │ └── search.html
│ ├── tests.py
│ └── views.py
├── tryit
│ ├── __init__.py
│ ├── admin.py
│ ├── models.py
│ ├── templates
│ │ └── tryit
│ │ ├── index.html
│ │ └── poll.html
│ ├── tests.py
│ └── views.py
├── manage.py
└── zqxt
├── __init__.py
├── settings.py
├── urls.py
└── wsgi.py
定义模板
变量:视图传递给模板的数据 要遵守标识符规则
语法:
{{var}}
注意:如果使用的变量不存在,则插入的是空字符串
在模板中使用点语法
当成字典处理 如果不是则当成属性或者方法 最后 为数字索引
在模板中调用对象的方法
不能传递参数
标签
语法:
{% tag%}
作用:
在输出中创建文本
控制逻辑和循环
if
格式:
{%if 表达式1%}
语句
{%end if%}
{%if 表达式2%}
语句
{%else%}
语句
{%end if%}
for
格式:
{%for 变量 in 列表%}
语句
{%enf for%}
{%for 变量 in 列表%}
语句
{%empty%}
语句
{%endfor%}
列表为空或者列表不存在 执行下一个语句
{{forloop.counter}}
表示当前是第几次循环
comment
作用:注释多行
语法:
{%comment%}
注释的内容
{%endcomment%}
ifqual/ifnotequal
作用:判断是否相等或者不相等
格式
{%if equal值1:值2%}
语句
{%endqual%}
include
作用:加载模板并以标签内的参数渲染
格式:
{%include'模板目录' 参数1 参数2%}
url
作用:反向解析
格式
{%url'namespace:name' p1 p2%}
csrf_token
作用:用于跨站请求伪造保护的
格式:{%csrf_token%}
block \ extends
作用:用于模板的继承
格式
autoescape
作用:用于HTML的转义
过滤器
语法:
{{var|过滤器}}
作用:
在变量被显示前修改它
lower
upper
<h1>{{str|upper}}</h1>
<h1>{{str}}</h>
过滤器可以传递参数,参数用引号引起来
join
格式:
列表 |join:‘#’
如果一个变量没有被提供, 或者值为False ,空 可以使用默认值
default
格式:
{{var|default:'good'}}
根据给定格式转换日期为字符串
格式{{dateVal|date:'y-m-d'}}
加减乘除:
<h1>num = {{num}}</h1>
<h1>num = {{num|add:10}}</h1>
<h1>num = {{num|add :-5}</h1>
<h1>num = {{%num widthratio num 1 5%}}</h1> num *5 num/1 *5
<h1>num = {{%num widthratio 5 1 % }}</h1> num/5
注释
单行注释
语法
{#注释的内容#}
多行注释
{%comment%}
注释的内容
{%endcomment%}
反向解析
APp/urls
index.html
urls.py
good.html
views.py
模板继承
作用:
模板继承可以减少页面的内容的重复定义,实现页面的重用
block标签:
语法:
{%block 标签名%}
{%endblock 标签名%}
在父模板预留区域,子模版去填充
extend 标签
继承模板,需要卸载模板文件第一行
语法:
{%extend ‘父模板路径’%}
eg:
定义父模板
定义子模版
base.html
main.html
detail.html
url.py
view.py
127.0.0.1:8000/main
127.0.0.1:8000/detail
HTML转义
问题
views.py
index.html
1270.0.0.1:8000/index
直接将接受到的code当成普通字符串来渲染
需要将接受到的字符串当成HTML代码
escape:
safe
autoescape(解决多个)
CSRF
跨站请求伪造
某些恶意网站包含链接,表单,按钮,会利用登陆用户在浏览器中认真 从而工具服务
防止方法:
在settings.py文件MIDDLEWARE中
或者
在自己的网页源码中
验证码
作用:
在用户注册,登陆页面得时候使用,为了防止暴力请求,减轻服务器得压力,防止csrf得方式
参考文档
https://blog.youkuaiyun.com/teavamc/article/details/77566781