[Django模板系统]大致了解Django的模板系统
2015-10-12 22:01
399 查看
注:以下内容转载自 现代魔法学院 网站的 大致了解Django的模板系统 一文,仅供学习使用。
目前为止,我们已经写好了视图函数和硬编码的 HTML。在演示核心概念时,我们所作的是为了保持简单。但是在现实世界中,这差不多总是个坏主意。
幸运的是,Django 内建有一个简单有强大的模板处理引擎来让你分离两种工作:设计 HTML 页面和编写 Python 代码。
在前面,你可能已经注意到我们在例子视图中返回文本的方式有点特别。也就是说,HTML 被直接硬编码在 Python 代码之中。
尽管这种技术便于解释视图是如何工作的,但直接将 HTML 硬编码到你的视图里却并不是一个好主意。 为什么呢?
对页面设计进行的任何改变都必须对 Python 代码进行相应的修改。站点设计的修改往往比底层 Python 代码的修改要频繁得多,因此如果可以在不进行 Python 代码修改的情况下变更设计,那将会方便得多。
Python 代码编写和 HTML 设计是两项不同的工作,大多数专业的网站开发环境都将他们分配给不同的人员(甚至不同部门)来完成。设计者和 HTML/CSS 的编码人员不应该被要求去编辑 Python 的代码来完成他们的工作。
程序员编写 Python 代码和设计人员制作模板两项工作同时进行的效率是最高的,远胜于让一个人等待另一个人完成对某个既包含 Python又包含 HTML 的文件的编辑工作。
基于这些原因,将页面的设计和 Python 的代码分离开会更干净简洁更容易维护。我们可以使用 Django 的模板系统 (Template System)来实现这种模式。
大略认识模板长什么样子
模板是一个文本,用于分离文档的表现形式和内容。模板定义了占位符以及各种用于规范文档该如何显示的各部分基本逻辑(模板标签)。模板通常用于产生 HTML,但是 Django 的模板也能产生任何基于文本格式的文档。
让我们从一个简单的例子模板开始。该模板描述了一个向某个与公司签单人员致谢 HTML 页面。可将其视为一个格式信函:
这个模板是一段添加了些许变量和模板标签的基础 HTML。让我们逐步分析一下:
用两个大括号括起来的文字(例如 {{ person_name }})称为变量(variable) 。这意味着在此处插入指定变量的值。如何指定变量的值呢?稍后就会说明。
被大括号和百分号包围的文本(例如 {% if ordered_warranty %})是模板标签(template tag) 。标签(tag)定义比较明确,即:仅通知模板系统完成某些工作的标签。
这个例子中的模板包含一个 for 标签( {% for item in item_list %})和一个 if 标签({% if ordered_warranty %})。for 标签类似 Python 的 for 语句,可让你循环访问序列里的每一个项目。if 标签,正如你所料,是用来执行逻辑判断的。在这里,tag标签检查ordered_warranty值是否为 True。如果是,模板系统将显示{% if ordered_warranty %}和{% else %}之间的内容;否则将显示{%
else %}和{% endif %}之间的内容。{% else %}是可选的。
最后,这个模板的第二段中有一个关于 filter 过滤器的例子,它是一种最便捷的转换变量输出格式的方式。如这个例子中的{{ship_date|date:”F j, Y” }},我们将变量ship_date传递给date过滤器,同时指定参数”F j,Y”。date过滤器根据参数进行格式输出。过滤器是用管道符(|)来调用的,具体可以参见Unix管道符。
Django 模板含有很多内置的 tags 和 filters,我们后面会陆续学到。后面还会列出了很多的 tags 和 filters 的列表,熟悉这些列表对你来说是个好建议。你还可以利用它创建自己的tag和filters。
目前为止,我们已经写好了视图函数和硬编码的 HTML。在演示核心概念时,我们所作的是为了保持简单。但是在现实世界中,这差不多总是个坏主意。
幸运的是,Django 内建有一个简单有强大的模板处理引擎来让你分离两种工作:设计 HTML 页面和编写 Python 代码。
在前面,你可能已经注意到我们在例子视图中返回文本的方式有点特别。也就是说,HTML 被直接硬编码在 Python 代码之中。
def current_datetime(request): now = datetime.datetime.now() html = "<html><body>It is now %s.</body></html>" % now return HttpResponse(html)
尽管这种技术便于解释视图是如何工作的,但直接将 HTML 硬编码到你的视图里却并不是一个好主意。 为什么呢?
对页面设计进行的任何改变都必须对 Python 代码进行相应的修改。站点设计的修改往往比底层 Python 代码的修改要频繁得多,因此如果可以在不进行 Python 代码修改的情况下变更设计,那将会方便得多。
Python 代码编写和 HTML 设计是两项不同的工作,大多数专业的网站开发环境都将他们分配给不同的人员(甚至不同部门)来完成。设计者和 HTML/CSS 的编码人员不应该被要求去编辑 Python 的代码来完成他们的工作。
程序员编写 Python 代码和设计人员制作模板两项工作同时进行的效率是最高的,远胜于让一个人等待另一个人完成对某个既包含 Python又包含 HTML 的文件的编辑工作。
基于这些原因,将页面的设计和 Python 的代码分离开会更干净简洁更容易维护。我们可以使用 Django 的模板系统 (Template System)来实现这种模式。
大略认识模板长什么样子
模板是一个文本,用于分离文档的表现形式和内容。模板定义了占位符以及各种用于规范文档该如何显示的各部分基本逻辑(模板标签)。模板通常用于产生 HTML,但是 Django 的模板也能产生任何基于文本格式的文档。
让我们从一个简单的例子模板开始。该模板描述了一个向某个与公司签单人员致谢 HTML 页面。可将其视为一个格式信函:
<html> <head><title>Ordering notice</title></head> <body> <h1>Ordering notice</h1> <p>Dear {{ person_name }},</p> <p>Thanks for placing an order from {{ company }}. It's scheduled to ship on {{ ship_date|date:"F j, Y" }}.</p> <p>Here are the items you've ordered:</p> <ul> {% for item in item_list %} <li>{{ item }}</li> {% endfor %} </ul> {% if ordered_warranty %} <p>Your warranty information will be included in the packaging.</p> {% else %} <p>You didn't order a warranty, so you're on your own when the products inevitably stop working.</p> {% endif %} <p>Sincerely,<br />{{ company }}</p> </body> </html>
这个模板是一段添加了些许变量和模板标签的基础 HTML。让我们逐步分析一下:
用两个大括号括起来的文字(例如 {{ person_name }})称为变量(variable) 。这意味着在此处插入指定变量的值。如何指定变量的值呢?稍后就会说明。
被大括号和百分号包围的文本(例如 {% if ordered_warranty %})是模板标签(template tag) 。标签(tag)定义比较明确,即:仅通知模板系统完成某些工作的标签。
这个例子中的模板包含一个 for 标签( {% for item in item_list %})和一个 if 标签({% if ordered_warranty %})。for 标签类似 Python 的 for 语句,可让你循环访问序列里的每一个项目。if 标签,正如你所料,是用来执行逻辑判断的。在这里,tag标签检查ordered_warranty值是否为 True。如果是,模板系统将显示{% if ordered_warranty %}和{% else %}之间的内容;否则将显示{%
else %}和{% endif %}之间的内容。{% else %}是可选的。
最后,这个模板的第二段中有一个关于 filter 过滤器的例子,它是一种最便捷的转换变量输出格式的方式。如这个例子中的{{ship_date|date:”F j, Y” }},我们将变量ship_date传递给date过滤器,同时指定参数”F j,Y”。date过滤器根据参数进行格式输出。过滤器是用管道符(|)来调用的,具体可以参见Unix管道符。
Django 模板含有很多内置的 tags 和 filters,我们后面会陆续学到。后面还会列出了很多的 tags 和 filters 的列表,熟悉这些列表对你来说是个好建议。你还可以利用它创建自己的tag和filters。
相关文章推荐
- Windows下安装Django
- uva757 - Gone Fishing(馋)
- selenium无法调用chrome或者firefox的原因
- google镜像访问地址
- 在Google使用Borg进行大规模集群的管理 3-4
- [已解决]下载chromium源码 download_from_google_storage 无法下载文件
- django关于csrf防止跨站的ajax请求403处理
- LSGO软件技术团队2015~2016学年第六周(1005~1011)总结
- AntsAlgorithm
- mongo导入命令
- django 模板中定义临时列表
- django通过middleware计算每个页面的详细执行时间
- django设置cookies
- UVa481 What Goes Up
- Google搜索的几个使用技巧——让你的搜索结果更准确
- good page
- django登陆成功失败,显示颜色
- [原]Django调试工具--django-debug-toolbar
- HDOJ 题目3966 Aragorn's Story(树链剖分,树状数组)
- django中 下拉框