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. 给tabBar设置图片和字体颜色的几种方法

    现在很多应用都使用到了tabBar,我们往往在给tabBar设置图片和字体的时候,当选中状态下,往往字体的颜色和图片的颜色不匹配,有时候就显得无从下手,我也常常忘了,所有写这个博客的目的,相当于给自己 ...

  2. mysql 允许远程登陆

    参考:http://blog.chinaunix.net/uid-23215128-id-2951624.html 1.以root账户登录 2.grant all PRIVILEGES on disc ...

  3. 【转】Struts1.x系列教程(7):Logic标签库

    转载地址:http://www.blogjava.net/nokiaguy/archive/2009/01/archive/2009/01/archive/2009/01/archive/2009/0 ...

  4. dotfiles管理

    刚刚知道dotfiles这个东西,百度也没发现什么太有价值的讲解,还都是英文,所以自己立志来好好屡屡清楚 1.dotfiles是什么?我自己的理解:linux下(mac下)有各种app,每个人会根据自 ...

  5. 如何面试有2年java工作经验的应聘人员

    1.什么是事务控制?答:事务控制就是将一系列操作当成一个不可拆分的逻辑单元,保证这些操作要么都成功,要么都失败.在关系数据库中,一个事务可以是一条SQL语句,一组SQL语句或整个程序.事务是恢复和并发 ...

  6. 【leetcode❤python】 190. Reverse Bits

    #-*- coding: UTF-8 -*- class Solution:    # @param n, an integer    # @return an integer    def reve ...

  7. Arduino学习笔记二:修改LED点灯程序

    看了开源社区的LED控制程序,开始上手代码编写,修改,下载以及调试,原文地址:http://www.arduino.cn/thread-1072-1-1.html,这个帖子写的比较通俗易懂. 自己移植 ...

  8. CUBRID学习笔记 48查询优化

    cubrid的中sql查询语法 查询优化 c#,net,cubrid,教程,学习,笔记欢迎转载 ,转载时请保留作者信息.本文版权归本人所有,如有任何问题,请与我联系wang2650@sohu.com ...

  9. NSTimer(定时器)

    [_timer fire]; fire并不是启动一个定时器,只是执行一次定时器事件(触发一次定时器事件)而已; 注意:不影响定时器设置的时间,即,不影响之前设定的使用,定时器该怎么跑就怎么跑,fire ...

  10. equals

    package abstractClasses; import java.time.LocalDate; /** * Created by xkfx on 2016/12/20. */ public ...