语法: {% tag %}
作用
说明
==, !=, >=, <=, >, < and, or, not, in, not in这些操作符都可以在模板中使用
格式
格式一:单一条件分支
{% if condition %}
... display
{% endif %}
格式二:双向条件分支
{% if condition %}
... display
{% else %}
... display
{% endif %}
格式三:多向条件分支
{% if condition1 %}
... display 1
{% elif condition2 %}
... display 2
{% else %}
... display 3
{% endif %}
实例
{% if 'l' in 'lucky' %}
<h2>l 在 lucky字符串中</h2>
{% else %}
<h2>l 不在 lucky字符串中</h2>
{% endif %}
{% if athlete_list and coach_list %}
athletes 和 coaches 变量都是可用的。
{% endif %}
注意
表达式中不能使用算术运算符
if/else 支持嵌套
说明
与Python的 for 语句的情形类似,循环语法是 for X in Y ,Y是要迭代的序列而X是在每一个特定的循环中使用的变量名称
每一次循环中,模板系统会渲染在 {% for %} 和 {% endfor %} 之间的所有内容
格式
格式一
{% for var in sequence %}
...
{% endfor %}
格式二 搭配empty
{% for var in sequence %}
...
{% empty %}
...
{% endfor %}
注意
迭代对象不存在或对象为空值时执行empty语句
使用
遍历字典
<span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">home</span><span class="hljs-params">(request)</span>:</span>
info_dict = {<span class="hljs-string">'name'</span>: <span class="hljs-string">'lucky'</span>, <span class="hljs-string">'age'</span>: <span class="hljs-number">18</span>}
<span class="hljs-keyword">return</span> render(request, <span class="hljs-string">'home.html'</span>, {<span class="hljs-string">'info_dict'</span>: info_dict})
模板
{% for key, value in info_dict.items %}
{{ key }}: {{ value }}
{% endfor %}
reversed 反向迭代
{% for name in name_list reversed %}
...
{% endfor %}
嵌套使用 {% for %} 标签
{% for i in info %}
<h1>{{ i }}</h1>
<ul>
{% for sport in athlete.sports_played %}
<li>{{ sport }}</li>
{% endfor %}
</ul>
{% endfor %}
获取迭代状态
变量 | 描述 |
---|---|
forloop.counter | 索引从 1 开始算 |
forloop.counter0 | 索引从 0 开始算 |
forloop.revcounter | 索引从最大长度到 1 |
forloop.revcounter0 | 索引从最大长度到 0 |
forloop.first | 当遍历的元素为第一项时为真 |
forloop.last | 当遍历的元素为最后一项时为真 |
forloop.parentloop | 用在嵌套的 for 循环中,获取上一层 for 循环的 forloo |
作用
判断是否相等/不相等
格式
ifequal
{% ifequal 表达式1 表达式2 %}
语句
{% endifequal %}
搭配else
{% ifequal 表达式1 表达式2 %}
语句1
{% else %}
语句2
{% endifequal %}
ifnotequal
{% ifnotequal 表达式1 表达式2 %}
语句
{% endifnotequal %}
搭配else
{% ifnotequal 表达式1 表达式2 %}
语句1
{% else %}
语句2
{% endifnotequal %}
作用
代码调试
解释说明
格式
单行注释
{# 语句 #}
多行注释
{% comment %}
语句
{% endcomment %}
使用
单行注释
{# <h1>lucky is a cool man</h1> #}
多行注释
{% comment %}
<h1>lucky is a cool man</h1>
<h1>lucky is a handsome man</h1>
{{stu.sname}}
{% endcomment %}
注意
注释的代码都不会再浏览器的HTML页面中显示出来
说明
include
语句可以把一个模板引入到另外一个模板中,类似于把一个模板的代码copy到另外一个模板的指定位置
使用
目录结构
project/
App/
templates/
common/
header.html
footer.html
header.html
<nav>我是头部</nav>
footer.html
<footer>底部</footer>
test_include.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<style>
*{
padding:0;
margin: 0;
}
nav{
width:100%;
height: 40px;
background-color: #000;
color: #fff;
}
footer{
width:100%;
height: 100px;
background-color: orange;
position: absolute;
bottom:0;
}
</style>
</head>
<body>
{% include 'common/head.html' %}
<div>我是中间主体部分</div>
{% include 'common/footer.html' %}
</body>
</html>
注意
导入的文件的代码一定是当前需要的 不要添加任何其它的代码 包括主体结构 否则会将当前页面的所有代码包含进来
概述
Django
中的模板可以继承,通过继承可以把模板中许多重复出现的元素抽取出来,放在父模板中,并且父模板通过定义block
给子模板开一个口,子模板根据需要,再实现这个block
作用
用于模板的继承 可以减少页面的内容的重复定义,实现页面的重用
block标签
在父模板中预留区域,子模板去填充
格式
{% block 标签名 %}
...
{% endblock 标签名 %}
extends标签
用于子模板继承父模板 并实现模板复用
格式
{% extends <span class="hljs-string">'父模板路径'</span> %}
注意:该标签必须写在子模板中的第一行
使用
基础模板base.html
<!DOCTYPE html>
<html lang=<span class="hljs-string">"en"</span>>
<head>
{% block head %} {<span class="hljs-comment"># 开放一个地方,以待具体赋值 #}</span>
<style>
<span class="hljs-comment">#content{font-size:20px;}</span>
</style>
<title>{% block title %}title{% endblock %}</title>
{% endblock %}
</head>
<body>
<div id=<span class="hljs-string">"content"</span>>
{% block content %}
<div>这里是默认内容,所有继承自这个模板的,如果不覆盖就显示这里的默认内容。</div>
{% endblock %}
</div>
{% block footer %}
© Copyright <span class="hljs-number">2008</span> by <a href=<span class="hljs-string">"#"</span>>lucky</a>.
{% endblock %}
</div>
</body>
</html>
子模板children.html
{% extends "base.html" %} {# 1:继承父模板 #}
{% block title %}Index{% endblock %} {# 2:书写title block #}
{% block head %} {#3:书写head block #}
{{ block.super }} {# 4 调用父模板中的内容,如果不调用,则此处会被子模板中书写的内容覆盖掉 #}
<style type="text/css">
.important { color: #336699; }
</style>
{% endblock %}
{% block content %}{# 5:书写content block #}
<h1>Index</h1>
<p class="important">
Welcome to my lucky homepage.
</p>
{% endblock %}
注意
命名空间
path(<span class="hljs-string">r''</span>, include((<span class="hljs-string">'App.urls'</span>, <span class="hljs-string">'App'</span>), namespace=<span class="hljs-string">'App'</span>)),
无参路由
path(<span class="hljs-string">r'index/'</span>, views.index, name=<span class="hljs-string">'index'</span>)
<a href="{% url 'App:index' %}">首页</a>
构造带参路由地址
path(<span class="hljs-string">r'args/<str:name>/<int:age>/'</span>, views.args, name=<span class="hljs-string">'args'</span>),
re_path(<span class="hljs-string">r'args/(\w+)/(\d+)/'</span>, views.args, name=<span class="hljs-string">'args'</span>),
{# 普通参数 #}
<a href="{% url 'App:args' 'lucky' 18 %}">args</a> #/args/lucky/18/
关键字参数构造路由地址
path(<span class="hljs-string">r'args/<str:name>/<int:age>/'</span>, views.args, name=<span class="hljs-string">'args'</span>),
re_path(<span class="hljs-string">r'args/(?P<name>\w{3,5)/(?P<age>\d{1,2})/'</span>, views.args, name=<span class="hljs-string">'args'</span>),
{# 关键字参数 #}
<a href="{% url 'App:args' name='lucky' age=18 %}"> #/args/lucky/18/
说明
某些恶意的网站上包含链接、表单按钮或者JavaScript代码,他们会利用登陆过的信息试图在你的网站上完成某些操作,这就是跨站攻击
作用
在客户端生成一个名为csrftoken的cookie
在页面生成一个隐藏域,name值为csrfmiddlewaretoken,value值会根据cookie的值进行计算生成
用于跨站请求伪造保护
原理
请求会带着cookie到服务端,服务器中的中间件(六娃)首先会获取键名为csrftoken的cookie的值,在获取表单中键为csrfmiddlewaretoken的值,在进行对比运算,如果符合条件则继续请求,否则中断请求,并返回给客户端403错误
防止CSRF
在settings.py文件中的MIDDLEWARE增加**(默认已开启)**
<span class="hljs-string">'django.middleware.csrf.CsrfViewMiddleware'</span>,
格式
{% csrf_token %}
使用
<form action="{% url 'App:dologin' %}" method="post">
{% csrf_token %}
...
</form>
作用
HTML转义标签
注意
Django服务默认开启转义
使用
<span class="hljs-keyword">return</span> render(request,<span class="hljs-string">'App/index.html'</span>,{<span class="hljs-string">"code"</span>:<span class="hljs-string">"<h1>lucky is a very good man</h1>"</span>})
{{code}}
safe
{{ code|safe }}
autoescape off 渲染
{% autoescape off %}
{{ code }}
{% endautoescape %}
autoescape on 不渲染
{% autoescape on %}
{{ code }}
{% endautoescape %}
加法
{{ value|add:10 }}
说明:value=5,则结果返回15
减法
{{ value|add:-10 }}
说明:value=5,则结果返回-5,加一个负数就是减法了
乘法
{% widthratio 5 1 100%}
说明:等同于:(5 / 1) * 100 ,结果返回500,withratio需要三个参数,它会使用参数1/参数2*参数3的方式进行运算,进行乘法运算,使参数2=1
除法
{% widthratio 5 100 1%}
说明:等同于:(5 / 100) * 1,则结果返回0.05,和乘法一样,使 参数3= 1就是除法了