4.Django基于模板页面

在前一章中,HTML是直接被硬编码在 Python views.py代码中,如下:

from django.http import HttpResponse

import datetime

def hello(request):

      return HttpResponse("Hello world")

def current_datetime(request):

    now =   datetime.datetime.now()

    html   = "<html><body>It is now %s.</body></html>"   % now

    return   HttpResponse(html)

  在实际的项目开发中,站点页面设计的修改往往比底层 Python 代码的修改要频繁得多,如果每次对页面设计所进行的任何改变都必须对底层Python 代码进行相应的修改,是很难满足实际的项目开发需要的。因此, Django开发了一套模板系统 (Template System)来实现将页面的设计和Python的代码分离开的开发模式,本章节我们只通过简单的实例来说明模板系统如何运用,具体的模板系统的语法和原理,请参考《The Django Book》网站。

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

4.1.如何使用模板系统

在Python代码中使用Django模板的最基本方式如下:

  1. 可以用原始的模板代码字符串创建一个 Template 对象,同样Django也支持用指定模板文件路径的方式来创建 Template 对象;
  2. 调用模板对象的render方法,并且传入一套变量context。它将返回一个基于模板的展现字符串,模板中的变量和标签会被context值替换。
>>> from django import template

>>> t = template.Template('My name is {{ name   }}.')

>>> c = template.Context({'name': 'Haozi'})

>>> print t.render(c)

My name is Haozi.

>>> c = template.Context({'name': 'Wuch'})

>>> print t.render(c)

My name is Wuch.

4.1.1. 创建模板对象

  创建一个 Template 对象的方法就是直接实例化它。 Template 类就在 django.template 模块中,构造函数接受一个“原始模板代码”作为参数。

4.1.2. 模板渲染

  一旦创建一个 Template 对象,就可以用 context 来传递数据给它。 一个context是一系列变量和它们值的集合。

>>> from django.template import Context, Template

>>> t = Template('My name is {{ name }}.')

>>> c = Context({'name': 'Stephane'})

>>> t.render(c)

u'My name is Stephane.'

  需要注意的是,t.render(c)返回值是一个Unicode对象,不是普通的字符串。 你可以通过字符串前的u来区分。 在Django框架中,会一直使用Unicode字符串对象而不是普通的字符串。

4.1.3. 字典和Contexts

  Python的字典数据类型就是关键字和它们值的一个映射,Context 和字典很类似。context变量名必须由英文字符开始 (A-Z或a-z)并可以包含数字字符、下划线和小数点。

  Context在Django里是 Context 类,她的构造函数带有一个可选的参数: 一个字典映射变量和它们的值。 调用 Template 对象 的 render() 方法时,传递context来填充模板参数的值。

4.1.4. 同一模板,多个上下文

  一旦有了 模板 对象,我们可以通过它渲染多个context来获得不同的动态页面效果, 例如:

>>> from django.template import Template, Context

>>> t = Template('Hello, {{ name }}')

>>> print t.render(Context({'name': 'John'}))

Hello, John

>>> print t.render(Context({'name': 'Julie'}))

Hello, Julie

>>> print t.render(Context({'name': 'Pat'}))

Hello, Pat

4.2.    在视图中使用模板

现在我们使用模板技术来创建视图。 重新打开我们在前一章在 mysite.views 中创建的 current_datetime 视图:

from django.http import HttpResponse

import datetime

def current_datetime(request):

      now = datetime.datetime.now()

      html = "<html><body>It is now   %s.</body></html>" % now

      return HttpResponse(html)

  依据用 Django 模板系统把该视图修改为如下代码:

from   django.template import Template, Context

from django.http   import HttpResponse

import datetime

def   current_datetime(request):

    now = datetime.datetime.now()

    t =   Template("<html><body>It is now {{ current_date   }}.</body></html>")

    html = t.render(Context({'current_date':   now}))

    return HttpResponse(html)

  现在我们虽然使用了模板系统,但并未真正的实现数据与表现的分离,模板仍然嵌入在Python代码里。 下面我们在改进一下代码,将模板置于一个单独的文件中,并在视图中加载模板文件来最终解决表现与数据分开的问题。

4.3.    模板加载

  Django 为我们提供了一种使用方便且功能强大的 API ,用于从磁盘中加载模板。要使用此模板加载API,首先我们需将模板的存放位置告诉框架,在settings.py中配置模板文件的保存路径。打开mysite settings.py配置文件,找到TEMPLATE_DIRS设置项,加上文档模板的保存路径。

  告诉 Django 加载模板时,在哪里查找模板。 选择一个目录用于存放模板并将其添加到 TEMPLATE_DIRS 中,本例子中我们在mysite目录下创建子目录templates来放置模板文件,配置TEMPLATE_DIRS可以使用绝对路径来进行配置(即从文件系统根目录开始的目录路径)。

TEMPLATE_DIRS = (

    # Put strings   here, like "/home/html/django_templates" or   "C:/www/django/templates".

    # Always use   forward slashes, even on Windows.

# Don't forget to use absolute   paths, not relative paths.

'C:\My Files\Python   Projects\mysite\templates',

)

  下面我们是使用Python 代码这一点来构建动态的TEMPLATE_DIRS路劲的内容,代码如下:

import os.path

TEMPLATE_DIRS = (

     # Put strings here, like   "/home/html/django_templates" or   "C:/www/django/templates".

    # Always use forward slashes, even on   Windows.

#   Don't forget to use absolute paths, not relative paths.

    os.path.join(os.path.dirname(__file__),   'templates').replace('\\','/'),

)

  这段代码使用了Python 内部变量 __file__ ,该变量被自动设置为settings.py 文件所在的目录,然后由os.path.join 这个方法将这目录与 templates 进行连接。在windows下,它会智能地选择正确的后向斜杠”“进行连接,而不是前向斜杠”/”。

  接下来修改视图代码,框架使用 Django 模板加载功能来返回 current_datetime 视图:

from django.template.loader import   get_template

from django.template import Context

from django.http import HttpResponse

import datetime

def current_datetime(request):

    now = datetime.datetime.now()

    t = get_template('current_datetime.html')

    html = t.render(Context({'current_date':   now}))

    return HttpResponse(html)

  同时,在模板目录中创建包括以下模板代码 current_datetime.html 文件:

<html><body>It is now {{ current_date   }}.</body></html>

这样如下图,是模板直接在IE中浏览的效果。

注意:模板的目录结构,否则无法正常加载模板,mytime URL最后的访问效果如下图:

4.4.使用render_to_response()函数

  我们已经告诉你如何载入一个模板文件,然后用 Context渲染它,最后返回这个处理好的HttpResponse对象给用户。同时,Django提供了一个更方便简单的函数,让我们一次性地载入某个模板文件并渲染它,最后直接作为HttpResponse返回。

  该快捷方式就是位于 django.shortcuts 模块中名为 render_to_response() 的函数。下面代码就是使用 render_to_response() 重新编写过的 current_datetime 范例。

from django.shortcuts import   render_to_response

import datetime

def current_datetime(request):

    now   = datetime.datetime.now()

      return render_to_response('current_datetime.html', {'current_date':   now})

  render_to_response() 的第一个参数必须是要使用的模板名称。第二个参数是为该模板创建 Context 时所使用的字典。

4.5.    小结

  本章我们简要阐述了Django动态网页,以及如何通过加载模板文件来实现动态网页。关于Django模板的语法规则,还支持包含、继承等复杂的关系,进一步详细的模板语法请大家参考Django开发手册。

  下一章我们将介绍Django是如何访问数据库的内容——模型。

Python开发入门与实战4-模板页面的更多相关文章

  1. Python开发入门与实战3-Django动态页面

    3.Django动态页面 上一章节我们实现的helloworld视图是用来演示Django网页是创建的,它不是一个动态网页,每次运行/helloworld/,我们都将看到相同的内容,它类似一个静态HT ...

  2. Python开发入门与实战1-开发环境

    1.搭建Python Django开发环境 1.1.Python运行环境安装 Python官网:http://www.python.org/ Python最新源码,二进制文档,新闻资讯等可以在Pyth ...

  3. Python开发入门与实战8-基于Java的集成开发环境

    8. 基于Java的Python的集成开发环境 目前为止我们所有的代码和例子都是通过Notepad文本编辑器来实现的,实际项目开发中这种编码模式效率较低(大虾除外),使用IDE集成开发环境常常大幅度的 ...

  4. Python开发入门与实战13-基于模板的界面

    13. 基于模板的界面 本章我们将继续基于库存的简单例子来阐述如何在python django中体现MVC的架构,根据djangobook说明: M:数据存取部分,由django数据库层处理,本章要讲 ...

  5. Python开发入门与实战15-IIS部署

    15. IIS部署 前面的章节我们完成了基本的业务功能的开发,本章节我们来说说python django项目如何部署到实际的运行环境,完成开发系统的发布工作. Python Django 项目部署发布 ...

  6. Python开发入门与实战14-基于Extjs的界面

    14. 基于Extjs的界面 上一章我们实现了一个原生的html例子,本章我们将采用Extjs实现界面的展现,来说明MVC模式下我们是怎么考虑界面与业务层的关系的. 14.1. 引用Extjs目录 首 ...

  7. Python开发入门与实战6-表单

    6. 表单 从简朴的单个搜索框,到常见的Blog评论提交表单,再到复杂的自定义数据输入接口,HTML表单一直是交互性网站的重要交互手段.本章介绍如何用Django如何对用户通过表单提交的数据进行访问. ...

  8. Python开发入门与实战2-第一个Django项目

    2.第一个Django项目 上一章节我们完成了python,django和数据库等运行环境的安装,现在我们来创建第一个django project吧,迈出使用django开发应用的第一步. 2.1.创 ...

  9. Python开发入门与实战12-业务逻辑层

    12. Biz业务层 前面的章节我们把大量的业务函数都放在了views.py里,按照目前这一的写法,当我们编写的系统复杂较高时,我们的views.py将会越来越复杂,大量的业务函数包含其中使其成为一个 ...

随机推荐

  1. textarea 多行文本保存数据到DB,取出后恢复换行

    Steps: 1.保存到数据库之前把textarea中的换行字符转换为<br>. var dbStr = textareaStr.replace(/\n|\r\n/g,"< ...

  2. 用代码来理解 C#委托与事件

    C#中委托是什么?事件是委托吗? 1.委托是讲方法作为参数代入另一个方法中, 委托可以理解为指向一个函数的引用. class Program { public delegate void Delega ...

  3. python基本数据类型之集合set

    一.集合的定义 set集合,是一个无序且不重复的元素集合. 集合对象是一组无序排列的可哈希的值,集合成员可以做字典中的键.集合支持用in和not in操作符检查成员,由len()内建函数得到集合的基数 ...

  4. hdu 5749 Colmerauer

    题意:对于给定的$n \times m$矩阵$M$,定义$S(a,b)$为$M$的所有$a \times b$子矩阵的权重之和.一个矩阵的权重是指矩阵中所有马鞍点权值之和,在一个矩阵中某点是马鞍点当且 ...

  5. ListView实现Item上下拖动交换位置 并且实现下拉刷新 上拉加载更多

    ListView实现Item上下拖动交换位置  并且实现下拉刷新  上拉加载更多 package com.example.ListViewDragItem; import android.app.Ac ...

  6. 【转】malloc与free的底层实现

    本文转自:http://blog.163.com/xychenbaihu@yeah/blog/static/132229655201210975312473/ 如何查看进程发生缺页中断的次数? 用ps ...

  7. JAVA基础知识之JDBC——JDBC事务处理及批量更新

    JDBC事务 JDBC的事务由Connection提供,默认是打开的. 要开启事务,则要关闭自动提交, conn.setAutoCommit(false); 提交事务使用 conn.commit(); ...

  8. Android中插件开发篇之----动态加载Activity(免安装运行程序)

    一.前言 又到周末了,时间过的很快,今天我们来看一下Android中插件开发篇的最后一篇文章的内容:动态加载Activity(免安装运行程序),在上一篇文章中说道了,如何动态加载资源(应用换肤原理解析 ...

  9. R----data.table包介绍学习

    相比dplyr包,data.table包能够更大程度地提高数据的处理速度,这里就简单介绍一下data.tale包的使用方法. data.table:用于快速处理大数据集的哦 数据的读取 data.ta ...

  10. QT笔记之不规则窗口的实现

    QT实现的不规则窗口,是根据图片的形状显示 1.去标题栏 2.设置窗口背景为透明色 3.最后给窗口设置背景色 注:背景图为镂空的 格式为.png 图片资源下载:http://pan.baidu.com ...