详解Python的Django框架中的模版相关知识


Posted in Python onJuly 15, 2015

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,我们将陆续进行学习. 附录F列出了很多的tags和filters的列表,熟悉这些列表对你来说是个好建议. 你依然可以利用它创建自己的tag和filters。

Python 相关文章推荐
python实现进程间通信简单实例
Jul 23 Python
python关键字and和or用法实例
May 28 Python
python先序遍历二叉树问题
Nov 10 Python
关于Python数据结构中字典的心得
Dec 04 Python
详解tensorflow载入数据的三种方式
Apr 24 Python
Python 利用高德地图api实现经纬度与地址的批量转换
Aug 14 Python
pandas read_excel()和to_excel()函数解析
Sep 19 Python
详解基于python-django框架的支付宝支付案例
Sep 23 Python
python文件及目录操作代码汇总
Jul 08 Python
如何基于Python按行合并两个txt
Nov 03 Python
Python将CSV文件转化为HTML文件的操作方法
Jun 30 Python
Python IO文件管理的具体使用
Mar 20 Python
Django中处理出错页面的方法
Jul 15 #Python
在Django中创建动态视图的教程
Jul 15 #Python
Python的Django框架中的URL配置与松耦合
Jul 15 #Python
Django查找网站项目根目录和对正则表达式的支持
Jul 15 #Python
在Django中创建第一个静态视图
Jul 15 #Python
开始着手第一个Django项目
Jul 15 #Python
Python的Django框架可适配的各种数据库介绍
Jul 15 #Python
You might like
How do I change MySQL timezone?
2008/03/26 PHP
Laravel路由设定和子路由设定实例分析
2016/03/30 PHP
PHP随机获取未被微信屏蔽的域名(微信域名检测)
2017/03/19 PHP
jQuery)扩展jQuery系列之一 模拟alert,confirm(一)
2010/12/04 Javascript
Jquery原生态实现表格header头随滚动条滚动而滚动
2014/03/18 Javascript
jquery实现不同大小浏览器使用不同的css样式表的方法
2014/04/02 Javascript
js实现仿百度风云榜可重复多次调用的TAB切换选项卡效果
2015/08/31 Javascript
3种js实现string的substring方法
2015/11/09 Javascript
Mac系统下Webstorm快捷键整理大全
2017/05/28 Javascript
bootstrap multiselect下拉列表功能
2017/08/22 Javascript
VUE重点问题总结
2018/03/19 Javascript
jquery ajax加载数据前台渲染方式 不用for遍历的方法
2018/08/09 jQuery
自己动手封装一个React Native多级联动
2018/09/19 Javascript
详解js删除数组中的指定元素
2018/10/31 Javascript
微信小程序下拉框功能的实例代码
2018/11/06 Javascript
原生javascript单例模式的应用实例分析
2020/02/23 Javascript
vue pages 多入口项目 + chainWebpack 全局引用缩写说明
2020/09/21 Javascript
node.js爬虫框架node-crawler初体验
2020/10/29 Javascript
[01:07:22]2014 DOTA2华西杯精英邀请赛 5 24 DK VS VG加赛
2014/05/26 DOTA
简单总结Python中序列与字典的相同和不同之处
2016/01/19 Python
python自动保存百度盘资源到百度盘中的实例代码
2019/08/26 Python
python使用正则来处理各种匹配问题
2019/12/22 Python
如何配置关联Python 解释器 Anaconda的教程(图解)
2020/04/30 Python
pytorch 查看cuda 版本方式
2020/06/23 Python
使用python操作lmdb对数据读取的实例
2020/12/11 Python
CSS超出文本指定宽度用省略号代替和文本不换行
2016/05/05 HTML / CSS
FILA斐乐中国官方商城:意大利运动品牌
2017/01/25 全球购物
The Hut英国:英国领先的豪华在线百货商店
2019/07/26 全球购物
临床医学专业个人的自我评价
2013/09/27 职场文书
解放思想演讲稿
2014/09/11 职场文书
2015年学校综合治理工作总结
2015/07/20 职场文书
公司规章制度范本
2015/08/03 职场文书
公司出差管理制度范本
2015/08/05 职场文书
幼儿园科学课教学反思
2016/03/03 职场文书
2016年敬老月活动总结
2016/04/05 职场文书
MySQL中一条SQL查询语句是如何执行的
2022/04/08 MySQL