首页 > 其他 > 详细

Django模板修炼

时间:2019-04-01 21:26:22      阅读:102      评论:0      收藏:0      [点我收藏+]

引言:由于我们在使用Django框架时,不会将HTML代码采用硬编码的方式,因为会有以下缺点:

1 1:对页面设计进行的任何改变都必须对 Python 代码进行相应的修改。 站点设计的修改往往比底层 Python代码的修改要频繁得多,因此如果可以在不进行 Python 代码修改的情况下变更设计,那将会方便得多。
2 
3 2:Python 代码编写和 HTML 设计是两项不同的工作,大多数专业的网站开发环境都将他们分配给不同的人员(甚至不同部门)来完成。 设计者和HTML/CSS的编码人员不应该被要求去编辑Python的代码来完成他们的工作。
4 
5 3:程序员编写 Python代码和设计人员制作模板两项工作同时进行的效率是最高的,远胜于让一个人等待另一个人完成对某个既包含 Python又包含 HTML 的文件的编辑工作。

基于这些原因,将页面的设计和Python的代码分离开会更干净简洁更容易维护。 我们可以使用 Django的模板系统 (Template System)来实现这种模式。

模板系统的基本知识

1     模板是一个文本,用于分离文档的表现形式和内容。 模板定义了占位符以及各种用于规范文档该如何显示的各部分基本逻辑(模板标签)。 模板通常用于产生HTML,但是Django的模板也能产生任何基于文本格式的文档。

首先从一个使用模板的HTML页面开始了解Django模板:

技术分享图片

 1 1:用两个大括号括起来的文字(例如 {{ person_name }} )称为 变量(variable) 。这意味着在此处插入指定变量的值。 如何指定变量的值呢? 稍后就会说明。
 2 
 3 2:被大括号和百分号包围的文本(例如 {% if ordered_warranty %} )是 模板标签(template tag) 。标签(tag)定义比较明确,即: 仅通知模板系统完成某些工作的标签。
 4 
 5 3:这个例子中的模板包含一个for标签( {% for item in item_list %} )和一个if 标签({% if ordered_warranty %} )
 6  7 4:for标签类似Python的for语句,可让你循环访问序列里的每一个项目。 if 标签,正如你所料,是用来执行逻辑判断的。 在这里,tag标签检查ordered_warranty值是否为True。如果是,模板系统将显示{% if ordered_warranty %}和
 8 {% else %}之间的内容;否则将显示{% else %}和{% endif %}之间的内容。{% else %}是
可选的。 9 10 5:最后,这个模板的第二段中有一个关于filter过滤器的例子,它是一种最便捷的转换变量输出格式的方式。如这个例子中的{{ship_date|date:”F j, Y” }},我们将变量ship_date传递给date过滤器,同时指定参数”F,j,Y”。date过滤器 11 根据参数进行格式输出。 过滤器是用管道符(|)来调用的,具体可以参见Unix管道符。

如何使用模板系统

技术分享图片

创建模板对象

创建一个 Template 对象最简单的方法就是直接实例化它。 Template 类就在 django.template 模块中,构造函数接受一个参数,原始模板代码。 让我们深入挖掘一下 Python的解释器看看它是怎么工作的。

转到project目录(在第二章由 django‐admin.py startproject 命令创建), 输入命令python manage.py shell 启动交互界面。
一个特殊的Python提示符 如果你曾经使用过Python,你一定好奇,为什么我们运行python manage.py shell而不是python。这两个命令都会启动交互解释器,但是manage.py shell命令有一个重要的不同: 在启动解释器之前,它告诉Django使用哪个设置文件。
Django框架的大部分子系统,包括模板系统,都依赖于配置文件;如果Django不知道使用哪个配置文件,这些系统将不能工作。
如果你想知道,这里将向你解释它背后是如何工作的。 Django搜索DJANGO_SETTINGS_MODULE环境变量,它被设置在settings.py中。例如,假设mysite在你的Python搜索路径中,那么DJANGO_SETTINGS_MODULE应该被设置为:
’mysite.settings’。当你运行命令:python manage.py shell,它将自动帮你处理DJANGO_SETTINGS_MODULE。 在当前的这些示例中,我们鼓励你使用`` python manage.py shell``这个方法,这样可以免去你大费周章地
去配置那些你不熟悉的环境变量。
随着你越来越熟悉Django,你可能会偏向于废弃使用`` manage.py shell`` ,而是在你的配置文 件.bash_profile中手动添加 DJANGO_SETTINGS_MODULE这个环境变量。

注:当你创建一个 Template 对象,模板系统在内部编译这个模板到内部格式,并做优化,做好 渲染的准备。 如果你的模板语法有错误,那么在调用 Template() 时就会抛出 TemplateSyntaxError 异常。

出现TemplateSyntaxError 异常的几种情况:

1:无效的tags

2:标签的参数无效

3:无效的过滤器

4:过滤器的参数无效

5:无效的模板语法

6:未封闭的块标签 (针对需要封闭的块标签)

模板渲染

  一旦你创建一个 Template 对象,你可以用 context 来传递数据给它。 一个context是一系列变量和它们值的集合。context在Django里表现为 Context 类,在 django.template 模块里。 她的构造函数带有一个可选的参数:
一个字典映射变量和它们的值。 调用 Template 对象 的 render() 方法并传递context来填充模板:

技术分享图片

我们必须指出的一点是,t.render(c)返回的值是一个Unicode对象,不是普通的Python字符串。 你可以通过字符串前的u来区分。 在框架中,Django会一直使用Unicode对象而不是普通的字符串。 Django对Unicode支持,将让你的应用程序轻松
地处理各式各样的字符集,而不仅仅是基本的A
-Z英文字符。

字典和Contexts

Python的字典数据类型就是关键字和它们值的一个映射。 Context 和字典很类似, Context 还提供更多的功 能。
变量名必须由英文字符开始 (A
-Z或a-z)并可以包含数字字符、下划线和小数点。 (小数点在这里有特别的用途,稍后我们会讲到)变量是大小写敏感的。

这就是使用Django模板系统的基本规则: 写模板,创建 Template 对象,创建 Context , 调用 render() 方法。

同一模板,多个上下文

模板属于一次产生,多次使用

 

 

 

技术分享图片

Django 模板解析非常快捷。 大部分的解析工作都是在后台通过对简短正则表达式一次性调用来完成。 这和基于 XML 的模板引擎形成鲜明对比,那些引擎承担了 XML 解析器的开销,且往往比 Django 模板渲染引擎要慢上几个数量级。

深度变量查找

在模板中不仅可以传递字符串,还可以传递列表,字典等数据类型。在 Django 模板中遍历复杂数据结构的关键是句点字符 (.)。

假设你要向模板传递一个 Python 字典。 要通过字典键访问该字典的值,可使用一个句点:

技术分享图片

同样,也可以通过句点来访问对象的属性。 比方说, Python 的 datetime.date 对象有 year 、 month 和 day几个属性,你同样可以在模板中使用句点来访问这些属性:

技术分享图片

自定义一个类,同样可以使用句点号来调用类对象的属性。

技术分享图片

点语法也可以用来引用对象的* 方法*。

例如,每个 Python 字符串都有 upper() 和 isdigit() 方法,你在模板中可以使用同样的句点语法来调用它们:

技术分享图片

注意:这里调用方法时并* 没有* 使用圆括号 而且也无法给该方法传递参数;你只能调用不需参数的方法。

句点也可用于访问列表索引

技术分享图片

注:不允许使用负数列表索引。 像 {{ items.‐1 }} 这样的模板变量将会引发 TemplateSyntaxError 错误。

句点号在使用时,对于几种数据类型调用顺序为:

1:字典类型查找 (比如 foo["bar"] )

2:属性查找 (比如 foo.bar )

3:方法调用 (比如 foo.bar() )

4:列表类型索引查找 (比如 foo[bar] )

句点查找可以多级深度嵌套。

例如在下面这个例子中 {{person.name.upper}} 会转换成字典类型查找(person[‘name‘] ) 然后是方法调用( upper()  ):

技术分享图片技术分享图片

 

Django模板修炼

原文:https://www.cnblogs.com/sun-10387834/p/10638983.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!