文章目录[隐藏]
模板
定义模板
变量
- 视图传递给模板的数据
- 遵循标识符命名规则
- 语法:
{{var}}
- 注意
- 如果使用的变量不存在,则插入的是空字符串
- 在模板中使用点(.)语法
{{stu.name}}
- 字典查询
- 属性或者方法
- 数字索引
- 在模板中调用对象的方法
- 注意:不能传递参数
标签
- 语法:
{% tag %}
- 作用
- 在输出中创建文本
- 控制逻辑或循环
if
- 语法
# way1
{% if 表达式 %}
语句
{% endif %}
# way2
{% if 表达式 %}
语句1
{% else %}
语句2
{% endif %}
#way3
{% if 表达式1 %}
语句1
{% elif 表达式2 %}
语句2
...
{% elif 表达式n %}
语句n
{% else %}
语句e
{% endif%}
for
# way1
{% for var in 列表 %}
语句
{% endfor %}
# way2
{% for var in 列表 %}
语句
{% empty %}
语句2(列表为空或者列表不存在时执行语句2)
{% endfor %}
# 特殊var,表示第几次循环
{{forloop.counter}}
comment
注释多行
{% comment %}
注释内容
{% endcomment %}
ifequal/ifnotequal
判断是否相等或不相等
{% ifequal 值1 值2 %}
语句(如果值1等于值2则执行这个语句)
{% endifequal %}
include
加载模板并以标签内的参数渲染
{% include '模板目录' 参数1 参数2 %}
url
反向解析
{% url 'namespace:name' p1 p2%}
csrf_token
用于跨站请求伪造保护
{% csrf_token %}
block/extends
用于模板继承-
autoescape
用于HTML转义
过滤器
- 语法
{{ var|过滤器}}
- 作用
在变量显示前修改它
- lower
- upper
- 过滤器可以传递参数,参数用引号引起来
- join
- 格式:列表|join:"#"
- 例子:<p>{{list|join:"#"}}</p>
- 如果一个变量没有被引用,或者值为False/空,可以使用默认值defalut
- 格式:{{test|default:"没有"}}
- 示例:<p>{{test|default:"没有"}}</p>
- 根据指定格式转换日期为字符串
- 格式:{{ dateVal |date:"y-m-d"}}
- HTML转义escape
- 加减乘除
<h1>加减乘除</h1>
<h1>{{ num }}</h1>
<h1>{{ num|add:10 }}</h1>
<h1>{{ num|add:-5 }}</h1>
<!-- (num/1)*5 -->
<h1>{% widthratio num 1 5 %}</h1>
<!-- num/5 -->
<h1>{% widthratio num 5 1 %}</h1>
注释
- 单行注释
{# 注释的内容 #}
- 多行注释 [[Django#^6b98ce]]]
{% comment %}
注释内容
{% endcomment %}
反向解析
- 项目url配置
urlpatterns = [
path('admin/', admin.site.urls),
url(r'^', include(('myApp.urls',"myApp"),namespace='app')),
]
- application配置
urlpatterns = [
url(r'^good/(\d+)$',views.good,name='good'),
]
- html配置
<a href="{% url 'app:good' 2 %}">自动解析的方式-Good</a>
模板继承
作用
- 可以减少页面内容的重复定义,实现页面的重用
block标签
- 在父模板中预留区域,子模版去填充
- 语法,content为自定义的名称
{% block content %}
{% endblock %}
extends标签
- 继承模板,需要写在模板文件的第一行
- 语法
{% extends '父模板路径' %}
示例
- 定义父模板
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<style> #header{
width: 100%;
height: 100px;
background-color: #red;
padding: 2em;
text-align: center;
}
#footer{
width: 100%;
height: 100px;
background-color: blue;
padding: 2em;
text-align: center;
}
#content{
width: 100%;
height: 500px;
background-color: yellow;
padding: 2em;
text-align: center;
}
</style>
</head>
<body>
<div id="header">header</div>
<div id="content">
{% block content %}
{% endblock %}
<hr>
{% block content2 %}
{% endblock %}
</div>
<div id="footer">footer</div>
</body>
</html>
- 定义子模版
{% extends 'myApp/base.html' %}
{% block content %}
<h1>detail!</h1>
{% endblock %}
{% block content2 %}
<h1>detail2!</h1>
{% endblock %}
HTML转义
问题
- 直接在view把html传到模板中会被当作字符串渲染
作用
- 将接收到的字符串当作html代码渲染
方法
- 过滤器
safe
- 标签
autoescape
并启用off
{{code}}
<hr>
{{code|safe}}
<hr>
{% autoescape off %}
{{code}}
{% endautoescape %}
CSRF
跨站请求伪造
- 某些恶意网站包含链接、表单、按钮利用登录用户在浏览器中进认证,并进行攻击。
防止CSRF
- 在
seetings.py
中的MIDDLEWARE
添加'django.middleware.csrf.CsrfViewMiddleware',
- 在网页中加上
{% csrf_token %}
验证码
作用
- 在用户注册,登陆页面的使用使用,为了防止暴力请求。
- 防止CSRF的一种方式。