第四章 模板篇

上一章的内容,我们将HTML的代码和Python代码都混合在了在view.py的文件下。但是这样做的坏处无疑是明显的,引用DjangoBook的说法:

  • 对页面设计进行的任何改变都必须对 Python 代码进行相应的修改。 站点设计的修改往往比底层 Python 代码的修改要频繁得多,因此如果可以在不进行 Python 代码修改的情况下变更设计,那将会方便得多。

  • Python 代码编写和 HTML 设计是两项不同的工作,大多数专业的网站开发环境都将他们分配给不同的人员(甚至不同部门)来完成。 设计者和HTML/CSS的编码人员不应该被要求去编辑Python的代码来完成他们的工作。

  • 程序员编写 Python代码和设计人员制作模板两项工作同时进行的效率是最高的,远胜于让一个人等待另一个人完成对某个既包含 Python又包含 HTML 的文件的编辑工作。

这一章我们采用Template的方法来尽量将两部分代码进行分离。


一、引入模板模块

在view.py中导入模块

from django.template import Template,Context

其中,Template模块是负责HTML的模板操作,Context是负责前端界面的显示任务。

二、创建模板

1.<html>
2.<body>
3.{% ifequal passport 'ywc'%}
4.name:{{userName}},passport:{{passport}}
5.{% else %}
I6.input Error,please try it again......
7.</body>
8.</html>
9.{% endifequal %}

其中需要明白两个新引入的变量的概念

{% %}称为模板标签,下面我们将会列举出开发中使用的大部分标签,功能类似于JSP中的标签,我们甚至可以创建自己的标签。

{{   }}称为模板变量,我们在JSP开发中使用的是${}来获取从Servlet传递过来的数据,用于在前端展示

上面的代码的是判断passport是否等于'ywc' 如果相等的话就会把用户名和密码都显示在界面上,如果不等的话则会提示“input error......”的字符串。

我们在view.py中定义这样一个函数:

def template_20140627(request):
h = """
<html>
<body>
{% ifequal passport '123'%}
name:{{userName}},passport:{{passport}}
{% else %}
Input Error,please try it again......
</body>
</html>
{% endifequal %}"""
t = Template(h);
c = Context({'userName':'ywc','passport':'123'})
html = t.render(c);
return HttpResponse(html)

如上,我们将完成了在视图端的基本操作。用户的姓名为'ywc',密码为123.判断用户密码如果为123的话就输出用户名和用户密码,否则的话输出错误提示!

三、添加映射路径

在urls.py中添加如下:

(r'^tt/$', DjangoE_1.view.template_20140627)

在浏览器中输入访问地址http://localhost:8000/tt/就能看到我们的结果。


经过上面的操作,我们发现HTML代码依然被嵌入在view.py中,并没有实现分离的效果。其实,我们发现,最终显示在网页上的是response返回的字符串,因此,我们可以直接将模板单独放在一个文件夹下面,通过打开文件来获取该模板。我们在工程目录下新建一个名为template的文件夹。并将前面定义的模板teml.html放在该文件夹下面.

1、定义模板

<html>
<body>
{% ifequal passport '123'%}
name:{{userName}},passport:{{passport}}
{% else %}
Input Error,please try it again......
</body>
</html>
{% endifequal %}

2、在view.py 中定义函数

def template_20140628(request):
fp = open(r'C:\Python27\project\DjangoE_1\template\temp.html','r')
t = Template(fp.read())
fp.close()
html = t.render(Context({'userName':'ywc','passport':'123'}))
return HttpResponse(html

3、在urls.py中添加链接

(r'^tt2/$', DjangoE_1.view.template_20140628),

重新在浏览器内输入浏览地址,我们可以看到和上面的浏览器输出一个结果

同样,根据Python的DRY原则,上述代码依旧不够简洁,DjangoBook给出的解释如下:

  • 它没有对文件丢失的情况做出处理。 如果文件 mytemplate.html 不存在或者不可读, open() 函数调用将会引发 IOError 异常。

  • 这里对模板文件的位置进行了硬编码。 如果你在每个视图函数都用该技术,就要不断复制这些模板的位置。 更不用说还要带来大量的输入工作!

  • 它包含了大量令人生厌的重复代码。 与其在每次加载模板时都调用 open()fp.read()fp.close() ,还不如做出更佳选择。


Django给我们提供了一个get_template()函数可以从直接加载模板而不用每次都Open()该模板

1、在我们的setting.py中可以加载这样一个元组

STATIC_URL = '/static/'
TEMPLATE_DIRS = (
r'C:\Python27\project\DjangoE_1\template',
)
这就是我们的模板加载的路径

2、在view.py中定义如下函数:
加载模块:
from django.template.loader import get_template
def template_20140629(request):
t = get_template('temp.html');
html = t.render(Context({'userName':'ywc','passport':'123'}))
return HttpResponse(html)

3、在urls.py中添加下面的语句:
    (r'^tt3/$', DjangoE_1.view.template_20140629) 在浏览器中输入地址,我们可以获得对应的界面。在这个过程中,我们可能会发现很对url地址的问题。在开发的过程中,由于操作系统的问题,路径中的\和/是不同的。python引入了join函数,具体的可以参考python手册。

Django Web开发学习笔记(4)的更多相关文章

  1. Django Web开发学习笔记(1)

    一.Python的标准类型 (1)bool型 >>> bool("") False >>> bool(None) False >>& ...

  2. Django Web开发学习笔记(5)

    第五部分 Model 层 创建一个app工程.app和project的区别引用DjangoBook的说法是: 一个project包含很多个Django app以及对它们的配置. 技术上,project ...

  3. Django Web开发学习笔记(3)

    1.创建一个简单视图 这章是按照DgangoBook的说明.在我们创建的工程目录下面DjangoE_1(这是我为自己的工程命名的名字)新建一个view.py的文件,并在该文件下添加如下代码 from ...

  4. python的内存管理机制 图解+Django Web开发学习笔记

    http://www.cnblogs.com/CBDoctor/p/3781078.html http://www.cnblogs.com/vamei/p/3232088.html http://bl ...

  5. 【前端】移动端Web开发学习笔记【2】 & flex布局

    上一篇:移动端Web开发学习笔记[1] meta标签 width设置的是layout viewport 的宽度 initial-scale=1.0 自带 width=device-width 最佳实践 ...

  6. 【前端】移动端Web开发学习笔记【1】

    下一篇:移动端Web开发学习笔记[2] Part 1: 两篇重要的博客 有两篇翻译过来的博客值得一看: 两个viewport的故事(第一部分) 两个viewport的故事(第二部分) 这两篇博客探讨了 ...

  7. ASP.NET Core Web开发学习笔记-1介绍篇

    ASP.NET Core Web开发学习笔记-1介绍篇 给大家说声报歉,从2012年个人情感破裂的那一天,本人的51CTO,CnBlogs,Csdn,QQ,Weboo就再也没有更新过.踏实的生活(曾辞 ...

  8. Django Web开发指南笔记

    Django Web开发指南笔记 语句VS表达式 python代码由表达式和语句组成,由解释器负责执行. 主要区别:表达式是一个值,它的结果一定是一个python对象:如:12,1+2,int('12 ...

  9. PHP和MySQL Web开发学习笔记介绍

    前言 从2016年2月1日开始,之后的几个月左右的时间里,我会写一个系列的PHP和MySQL Web开发的学习笔记.我之前一直从事Java语言的开发工作,最近这段时间非常想学习一门语言,就选择了PHP ...

随机推荐

  1. jsp统计页面访问量和刷访问量的简单使用

    ~Jsp可以进行简单的页面访问量统计,当然也可以使用Jsp刷访问量. 1:第一种使用全局变量<%! int i=0;%>进行页面的访问量统计,只有新打开一个浏览器才可以进行统计. 2:第二 ...

  2. 《Java程序性能优化》之设计优化

    豆瓣读书:http://book.douban.com/subject/19969386/ 第一章 Java性能调优概述 1.性能的参考指标 执行时间: CPU时间: 内存分配: 磁盘吞吐量: 网络吞 ...

  3. Codeforces Round #424 E. Cards Sorting

    题目大意:给你一堆n张牌(数字可以相同),你只能从上面取牌,如果是当前牌堆里面最小的值则拿走, 否则放到底部,问你一共要操作多少次. 思路:讲不清楚,具体看代码.. #include<bits/ ...

  4. python实现用户登陆(sqlite数据库存储用户信息)

    python实现用户登陆(sqlite数据库存储用户信息) 目录 创建数据库 数据库管理 简单登陆 有些地方还未完善. 创建数据库 import sqlite3 #建一个数据库 def create_ ...

  5. linux下构建MysqlCluster集群,NDB搜索引擎

    搭建管理节点 Ndb搜索引擎对于服务器的内存要求比较高,因为所有数据节点的数据,以及索引,事务等等都需要加载进内存中. 下载 mysql-cluster-gpl-7.6.8-linux-glibc2. ...

  6. Codeforces.914D.Bash and a Tough Math Puzzle(线段树)

    题目链接 \(Description\) 给定一个序列,两种操作:一是修改一个点的值:二是给一个区间\([l,r]\),问能否只修改一个数使得区间gcd为\(x\). \(Solution\) 想到能 ...

  7. Android native thread相关

    几个主要的source code路径: /system/core/include/utils/threads.h /system/core/include/utils/Thread.h /system ...

  8. C#的?和??

    1.?? 为了实现Nullable数据类型转换成non-Nullable类型数据,才有的一个操作符: 意义:一变量取值,取符号左边的值,若左边为null,那么取赋值??右边的: 栗子:int  a=3 ...

  9. python 廖雪峰的官方网站

    https://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000/0014316119884678 ...

  10. log4j配置输出到多个日志文件

    通常我们项目里,有一些重要的日志想单独的输出到指定的文件,而不是全总输出到系统的日志文件中.那么我们log4j为我们提供了这种功能,以下我们来一步一步看是怎么做的.这里以property的配置方式写. ...