前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Django模板标签

Django模板标签

作者头像
星哥玩云
发布2022-09-14 17:46:48
1.6K0
发布2022-09-14 17:46:48
举报
文章被收录于专栏:开源部署

一、标签说明

语法: {% tag %}

作用

  • 在输出中创建文本
  • 控制逻辑和循环

二、if 标签

说明

==, !=, >=, <=, >, < and, or, not, in, not in这些操作符都可以在模板中使用

格式

格式一:单一条件分支

代码语言:javascript
复制
{% if condition %}
     ... display
{% endif %}

格式二:双向条件分支

代码语言:javascript
复制
{% if condition %}
     ... display
{% else %}
		 ... display
{% endif %}

格式三:多向条件分支

代码语言:javascript
复制
{% if condition1 %}
   ... display 1
{% elif condition2 %}
   ... display 2
{% else %}
   ... display 3
{% endif %}

实例

代码语言:javascript
复制
{% 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 支持嵌套

三、for 标签

说明

与Python的 for 语句的情形类似,循环语法是 for X in Y ,Y是要迭代的序列而X是在每一个特定的循环中使用的变量名称

每一次循环中,模板系统会渲染在 {% for %} 和 {% endfor %} 之间的所有内容

格式

格式一

代码语言:javascript
复制
{% for var in sequence %}
		...
{% endfor %}

格式二 搭配empty

代码语言:javascript
复制
{% for var in sequence %}
    ...
{% empty %}
    ...
{% endfor %}

注意

迭代对象不存在或对象为空值时执行empty语句

使用

遍历字典

代码语言:javascript
复制
<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})

模板

代码语言:javascript
复制
{% for key, value in info_dict.items %}
    {{ key }}: {{ value }}
{% endfor %}

reversed 反向迭代

代码语言:javascript
复制
{% for name in name_list reversed %}
	...
{% endfor %}

嵌套使用 {% for %} 标签

代码语言:javascript
复制
{% 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/ifnotequal 标签

作用

判断是否相等/不相等

格式

ifequal

代码语言:javascript
复制
{% ifequal 表达式1 表达式2 %}
	语句
{% endifequal %}

搭配else

代码语言:javascript
复制
{% ifequal 表达式1 表达式2 %}
	语句1
{% else %}
	语句2
{% endifequal %}

ifnotequal

代码语言:javascript
复制
{% ifnotequal 表达式1 表达式2 %}
	语句
{% endifnotequal %}

搭配else

代码语言:javascript
复制
{% ifnotequal 表达式1 表达式2 %}
	语句1
{% else %}
	语句2
{% endifnotequal %}

五、注释标签

作用

代码调试

解释说明

格式

单行注释

代码语言:javascript
复制
{# 语句 #}

多行注释

代码语言:javascript
复制
{% comment %}
	语句
{% endcomment %}

使用

单行注释

代码语言:javascript
复制
{# <h1>lucky is a cool man</h1> #}

多行注释

代码语言:javascript
复制
{% comment %}
    <h1>lucky is a cool man</h1>
    <h1>lucky is a handsome man</h1>
    {{stu.sname}}
{% endcomment %}

注意

注释的代码都不会再浏览器的HTML页面中显示出来

六、include 导入

说明

include语句可以把一个模板引入到另外一个模板中,类似于把一个模板的代码copy到另外一个模板的指定位置

使用

目录结构

代码语言:javascript
复制
project/
	App/
		templates/
			common/
				header.html
				footer.html

header.html

代码语言:javascript
复制
<nav>我是头部</nav>

footer.html

代码语言:javascript
复制
<footer>底部</footer>

test_include.html

代码语言:javascript
复制
<!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标签

在父模板中预留区域,子模板去填充

格式

代码语言:javascript
复制
{% block  标签名 %}
	...
{% endblock 标签名 %}

extends标签

用于子模板继承父模板 并实现模板复用

格式

代码语言:javascript
复制
{% extends  <span class="hljs-string">'父模板路径'</span> %}

注意:该标签必须写在子模板中的第一行

使用

基础模板base.html

代码语言:javascript
复制
&lt;!DOCTYPE html&gt;
&lt;html lang=<span class="hljs-string">"en"</span>&gt;
&lt;head&gt;
{% block head %} {<span class="hljs-comment"># 开放一个地方,以待具体赋值 #}</span>
  &lt;style&gt;
  	<span class="hljs-comment">#content{font-size:20px;}</span>
  &lt;/style&gt;
  &lt;title&gt;{% block title %}title{% endblock %}&lt;/title&gt;
{% endblock %}
&lt;/head&gt;
&lt;body&gt;
&lt;div id=<span class="hljs-string">"content"</span>&gt;
  {% block content %}
  	 &lt;div&gt;这里是默认内容,所有继承自这个模板的,如果不覆盖就显示这里的默认内容。&lt;/div&gt;
  {% endblock %}
&lt;/div&gt;
{% block footer %}
	© Copyright <span class="hljs-number">2008</span> by &lt;a href=<span class="hljs-string">"#"</span>&gt;lucky&lt;/a&gt;.
{% endblock %}
&lt;/div&gt;
&lt;/body&gt;
&lt;/html&gt;

子模板children.html

代码语言:javascript
复制
{% 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 %}

注意

  • 当重写了一个block,原来的显示内容就没了,八成的原因是没有调用super
  • 在模板中不能有同名的block
  • 不支持多继承

八、对比包含、继承

  • 相同点 均实现了代码的复用
  • 不同点
    • 包含是直接将目标文件整个渲染出来
    • 继承的本质是代码的替换,一般用来实现页面中重复不变的区域

九、url地址

命名空间

代码语言:javascript
复制
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>)),

无参路由

代码语言:javascript
复制
path(<span class="hljs-string">r'index/'</span>, views.index, name=<span class="hljs-string">'index'</span>)
代码语言:javascript
复制
<a href="{% url 'App:index' %}">首页</a> 

构造带参路由地址

代码语言:javascript
复制
path(<span class="hljs-string">r'args/&lt;str:name&gt;/&lt;int:age&gt;/'</span>, views.args, name=<span class="hljs-string">'args'</span>),
代码语言:javascript
复制
re_path(<span class="hljs-string">r'args/(\w+)/(\d+)/'</span>, views.args, name=<span class="hljs-string">'args'</span>),
代码语言:javascript
复制
{# 普通参数 #}
<a href="{% url 'App:args' 'lucky' 18 %}">args</a>  #/args/lucky/18/

关键字参数构造路由地址

代码语言:javascript
复制
path(<span class="hljs-string">r'args/&lt;str:name&gt;/&lt;int:age&gt;/'</span>, views.args, name=<span class="hljs-string">'args'</span>),
代码语言:javascript
复制
re_path(<span class="hljs-string">r'args/(?P&lt;name&gt;\w{3,5)/(?P&lt;age&gt;\d{1,2})/'</span>, views.args, name=<span class="hljs-string">'args'</span>),
代码语言:javascript
复制
{# 关键字参数 #}
<a href="{% url 'App:args' name='lucky' age=18 %}"> #/args/lucky/18/

十、跨站请求伪造 csrf

说明

某些恶意的网站上包含链接、表单按钮或者JavaScript代码,他们会利用登陆过的信息试图在你的网站上完成某些操作,这就是跨站攻击

作用

在客户端生成一个名为csrftoken的cookie

在页面生成一个隐藏域,name值为csrfmiddlewaretoken,value值会根据cookie的值进行计算生成

用于跨站请求伪造保护

原理

请求会带着cookie到服务端,服务器中的中间件(六娃)首先会获取键名为csrftoken的cookie的值,在获取表单中键为csrfmiddlewaretoken的值,在进行对比运算,如果符合条件则继续请求,否则中断请求,并返回给客户端403错误

防止CSRF

在settings.py文件中的MIDDLEWARE增加**(默认已开启)**

代码语言:javascript
复制
<span class="hljs-string">'django.middleware.csrf.CsrfViewMiddleware'</span>,

格式

{% csrf_token %}

使用

代码语言:javascript
复制
<form action="{% url 'App:dologin' %}" method="post">
    {% csrf_token %}  
  	...
</form>

十一、autoescape 标签

作用

HTML转义标签

注意

Django服务默认开启转义

使用

代码语言:javascript
复制
<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">"&lt;h1&gt;lucky is a very good man&lt;/h1&gt;"</span>})
{{code}}

safe

代码语言:javascript
复制
{{ code|safe }}

autoescape off 渲染

代码语言:javascript
复制
{% autoescape off %}
	{{ code }}
{% endautoescape %}

autoescape on 不渲染

代码语言:javascript
复制
{% autoescape on %}
	{{ code }}
{% endautoescape %}

十二、数学运算

加法

代码语言:javascript
复制
{{ value|add:10 }}

说明:value=5,则结果返回15

减法

代码语言:javascript
复制
{{ value|add:-10 }}

说明:value=5,则结果返回-5,加一个负数就是减法了

乘法

代码语言:javascript
复制
{% widthratio 5 1 100%}

说明:等同于:(5 / 1) * 100 ,结果返回500,withratio需要三个参数,它会使用参数1/参数2*参数3的方式进行运算,进行乘法运算,使参数2=1

除法

代码语言:javascript
复制
{% widthratio 5 100 1%}

说明:等同于:(5 / 100) * 1,则结果返回0.05,和乘法一样,使 参数3= 1就是除法了

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、标签说明
  • 二、if 标签
  • 三、for 标签
  • 四、ifequal/ifnotequal 标签
  • 五、注释标签
  • 六、include 导入
  • 七、模板继承
  • 八、对比包含、继承
  • 九、url地址
  • 十、跨站请求伪造 csrf
  • 十一、autoescape 标签
  • 十二、数学运算
相关产品与服务
消息队列 TDMQ
消息队列 TDMQ (Tencent Distributed Message Queue)是腾讯基于 Apache Pulsar 自研的一个云原生消息中间件系列,其中包含兼容Pulsar、RabbitMQ、RocketMQ 等协议的消息队列子产品,得益于其底层计算与存储分离的架构,TDMQ 具备良好的弹性伸缩以及故障恢复能力。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档