Django入门教程

前言

第一章: django快速入门

第二章: django MTV架构

第三章: django视图

第四章: django模板

第五章: django模型

第六章: django后台管理系统

第七章: 项目实战-简易的博客系统

第八章:django表单

第九章:django用户认证系统

第十章:django中的会话

第十一章:django安全

第十二章:django性能优化

第十三章:django实用工具

首页 > Django入门教程 > 第四章: django模板 > 4.3节: django模板语言

4.3节: django模板语言

薯条老师 2020-07-21 15:58:05 236269 0

编辑 收藏

广州番禺Python, Java小班周末班培训

薯条老师在广州做Python和Java的小班培训,一个班最多10人,学员的平均就业薪资有11K不在广州的同学可以报名线上直播班,跟线下小班的同学们同步学习。培训的课程有Python爬虫,Python后端开发,Python办公自动化,Python大数据分析,Python量化投资,Python机器学习,Java中高级后端开发。授课详情请点击:http://chipscoco.com/?cate=6

4.3.1 django模板中的特殊符号

在4.2.2 节中对Django模板语言进行了简单介绍,在django模板语言中提供了三个个特殊符号:

1. {{}}

2. {%%}

3. {##}

{{}}符号定义与模板变量相关的操作,例如变量的引用,对模板变量进行过滤。{%%}符号用来定义与应用逻辑相关的操作,例如加载静态资源,条件控制,循环控制,安全控制等。{##}用来进行代码注释,同Python中的#。在本节的内容中,薯条老师以{{}}与{%%}符号为角度,来介绍django中的模板语言, 学习其核心概念及用法,化繁为简,这样可以降低学习的难度。

4.3.2 {{}}符号

在django中使用{{}}符号来引用模板变量,同时可以对模板变量进行过滤。

 (1) 引用模板变量

4.2.3 节中介绍了render函数,在render函数中可以传递一个上下文参数(context),该参数类型为字典类型,字典类型的键名可以在模板文件中通过{{}}符号来进行引用,模板变量的输出为对应的键值。模板变量举例, render函数中的context参数:

{"title": "jazz of Django"}

在模板文件中进行引用:

{{title}}

模板文件中的{{title}}变量,其输出为"jazz of Django"。

 (2) 对模板变量执行过滤操作

 对模板变量进行过滤,是指使用django的过滤器函数来对模板变量进行处理。使用过滤器进行操作的基本语法:

{{variable | filter}}

variable表示模板变量,filter表示过滤器名。过滤器中可以传递参数,语法形式为:

{{variable | filter:arg}}

arg表示给过滤器传递的参数。在django中使用|符号将变量与过滤器函数进行连接,这里的|符号充当一个管道,将模板变量作为参数传递给过滤器函数进行处理。

django中的常用过滤器:

default: 如果变量为False或空值,则设置一个默认值,否则输出变量本身的值。

用法举例:

{{title | default:"jazz of Django"}}

如果title对应的键值为False或空值,则输出默认值:jazz of Django,否则输出title对应的键值。

length: 输出变量的长度,

用法举例:

{{ title | length }}

假设在render函数中传递的context参数为{"title": "jazz of Django"},则{{ title | length}}的输出为键值"jazz of Django"的长度,值为14。

add: 对模板变量与add过滤器的参数执行加法操作。在add过滤器中会先将变量与参数转换为整型,如果转换失败,会执行变量类型的加法操作,例如字符串类型的加法操作,是将字符串进行拼接。如果变量类型不支持加法运算,则返回空字符。

用法举例:

{{ value | add: "2"}}

在上文代码中,如果value的值为2,则输出为4,add过滤器先将value的值与"2"都转换为整型,然后再执行加法运算,所以输出为4。如果value的值为B,则输出为B2,add过滤器在类型转换过程中失败,然后直接将"B"与"2"进行拼接,所以输出为B2。

 cut: 删除模板变量中指定的字符,类似于python中的replace函数。

用法举例:

{{ title | cut: " "}}

假设title对应的键值为"jazz of Django",则{{ title | cut: " "}}表示删除title字符串中的所有空格字符,输出为:jazzofDjango,相当于执行了如下的代码:

title.replace(" ","")

lower,upper:  lower,upper过滤器会分别将模板变量转换为小写,大写。

first,last: first,last过滤器会分别取出列表,元组,字符串类型的第一个元素,最后一个元素。

用法举例:

{{ stars | first }}

假设stars对应的键值为["林子祥", "刘德华"],则{{ stars | first}}的输出为:林子祥。

{{ stars | last }}

假设stars对应的键值为["林子祥", "刘德华"],则{{ stars | last}}的输出为:刘德华。

 join:  将列表、元组、字符串用指定的字符进行拼接,列表,元组中的元素必须为字符串类型。

用法举例:

{{ stars | join:"@" }}

假设stars对应的键值为["林子祥", "刘德华"],则{{ stars | join:"@"}}的输出为:林子祥@刘德华。

 date:  将日期类型按指定的格式格式化为一个字符串。

用法举例:

{{ anniversary | date:"%Y/%m/%d %H:%M:%S"}}

%Y,%m,%d,%H,%M,%S是日期的格式化符号,分别表示年,月,日,时,分,秒,在上文的过滤操作中,会将anniversary格式化为"%Y/%m/%d %H:%M:%S"格式的字符串。

 safe

在django中,会自动对模板变量的内容进行HTML转义。例如模板变量的输出为:

<script>alert("黑客攻击")</script>

上述的输出为一段html代码,如果未进行转义,浏览器会弹出一个对话框。为了避免潜在的脚本注入攻击,django 会自动对用户的输入进行html转义。所谓的html转义是指将内容中的特殊字符用转义字符来进行代替。<符号与>符号是HTML中的特殊字符,其对应的转义字符分别为 &lt; , &gt;。

将html代码<script>alert("黑客攻击")</script>进行html转义,转义后的内容为:

&lt;script&gt;alert("黑客攻击")&lt;script&gt;

对模板变量使用safe过滤器,其作用是告诉django该变量的输出是安全的,无需进行HTML转义。以上为django模板中常用的过滤器,更多的过滤器,读者可以查阅官方文档。

 4.3.3 {%%}符号

{%%}符号用来定义与应用逻辑相关的操作,其主要的应用包含以下四个方面:

1. 引用静态资源

(1) 加载static

{% load static %}

在模板文件中引用静态文件前,需要先加载static,这样才能在文件中使用static来引用静态文件。

可以在settings.py中将static配置为自动加载,这样就无需在每个模板文件中进行手动加载。方法为在全局变量TEMPLATES中的OPTIONS字典中,设置builtins属性的值:'builtins': ['Django.templatetags.static']

(2) 引用静态文件

{% static path %}

path表示静态文件相对于静态目录的路径,例如如下的一种目录结构:

└── static

    ├──images

    │   ├── django.jpg

static目录为已配置的静态目录,则在模板中引用django.jpg的代码为:

{% static 'images/django.jpg' %}

2. 控制结构

django模板中的控制结构主要分为条件控制和循环控制。django模板中的控制结构同Python中的控制结构,但不同的是django中的条件控制会带上一个结束标签。

(1) Django模板中的条件控制结构

{% if %}
{% elif %}
{% else %}
{% endif %}

上文中的endif即为if的结束标签。

条件控制结构代码举例:

render函数中的context参数:

{
"admin":True,
"name":"Backer"
}

模板文件中根据admin的值来输出不同的页面内容:

<div>
{# 根据admin的值来判断是否为管理员 #}
{% if admin %}
<h2>管理员{{name}}</h2>
{% else %}
<h2>普通用户{{name}}</h2>
{% endif %}
</div>

django渲染后的html页面:

<div>
<h2>管理员Backer</h2>
</div>

读者要注意的是,在{%%}符号中引用变量时,无需再加上{{}}的符号。

 (2) django模板中的循环控制结构

{% for in %}
{% endfor %}

结构中的endfor为for结构的结束标签。

for循环控制结构代码举例:

render函数中的context参数:

{
   "stars":[{"name":"刘德华", "weibo_url":"xxxx"},{"name":"林子祥", "weibo_url":"xxxx"}],
}

模板文件中根据stars的值来输出明星的列表页:

<ul>
{# django使用for循环来进行遍历,同Python中的for语句 #}
{% for star in stars %}
{# 使用成员操作符.来访问字典中的键 #}
<li><a href="{{star.weibo_url]}}">{{star.name]}}的微博主页</a></li>
{% endfor %}
</ul>

django渲染后的html页面:

<ul>
<li><a href="xxxx">刘德华的微博主页</a></li>
<li><a href="xxxx">林子祥的微博主页</a></li>
</ul>

3. 安全控制

django在模板中提供了防止CSRF的方法,CSRF全称为Cross Site Request Forgery,即跨站请求伪造。

CSRF是利用用户在浏览器中已认证的登录信息,在目标网站中执行一些恶意的攻击,关于CSRF以及web安全,会在后续的教程中进行详细讲解。

在form表单中加上如下一行代码,可以有效防范CSRF:

<form>
{% csrf_token %}
</form>

django在进行模板渲染时,如遇到{%csrf_token%}代码,会生成一段html的隐藏域代码,隐藏域代码举例:

<input type='hidden' name='csrfmiddlewaretoken' value='nWj2B3Md9Z134NmX1MXDolPmh3bR2G98' />

input标签中的value值为django生成的一个随机token值,通过该token值可以对浏览器的访问请求进行校验。django服务器如果校验token的值为空或者错误,会拒绝这个可疑请求。

 4. 模板继承

django中的模板语言借鉴了面向对象的设计思想,可以对模板进行继承。通过模板继承,可以对模板代码进行复用,减少冗余。在4.4节中会对django的模板继承进行详细介绍。

 4.3.4 特殊符号的关闭

在某些场景下,需要关闭模板语言中的特殊符号,以阻止django对模板变量以及模板标签的渲染。考虑如下的一种场景:

<html>
{# 下面的if标签与django模板标签出现冲突 #}
{%if admin %}<h2>管理员用户</h2>{%end%}
</html>

假设代码中的{% if %} {% end %}为某种前端框架的模板标签,其与django中的模板标签出现了冲突,当django进行模板渲染时,会抛出语法错误的异常信息。为解决这样的问题,可以在代码中加上django的verbatim标签,以阻止django对模板标签的渲染。

django verbatim标签的语法形式:

{% verbatim %}
{% endverbatim %}

使用verbatim标签的代码举例:

<html>
{% verbatim %}
{%if admin %}<h2>管理员用户</h2>{%end%}
{% endverbatim %}
</html>

在上文代码中,由于加上了verbatim的标签,django会停止对代码中的{%if%}标签进行渲染。通过在verbatim标签块中指定一个自定义的标签名称,可以阻止对verbatim标签的渲染(也包括阻止其它django标签的渲染)。在verbatim指定自定义标签名称的语法形式:

{% verbatim  myblock %}
{% endverbatim  myblock%}

myblock表示自定义的标签名称。

 代码举例:

{% verbatim myblock %}
阻止Django通过{% verbatim %}{% endverbatim %} 标签块来进行渲染
{% endverbatim  myblock%}

4.3.5 最具实力的小班培训

薯条老师在广州做Python和Java的小班培训,一个班最多10人。不在广州的同学可以报名线上直播班,跟线下小班的同学们同步学习。打算参加小班培训的同学,必须遵守薯条老师的学习安排,认真做作业和项目。把知识学好,学扎实,那么找到一份高薪的工作就是很简单的一件事。

(1) Python后端工程师高薪就业班,月薪11K-18K,免费领取课程大纲
(2) Python爬虫工程师高薪就业班,年薪十五万,包拿Offer
(3) 数据分析高薪就业班,月薪11K-15K, 免费领取课程大纲
(4)
Python大数据挖掘,量化投资就业班,月薪12K-25K,免费领取课程大纲

扫码免费领取Python学习资料:


欢迎 发表评论: