Python 快速教程(Django03): 所谓伊人

在之前的程序中,我们直接生成一个字符串,作为http回复,返回给客户端。这一过程中使用了django.http.HttpResponse()。

在这样的一种回复生成过程中,我们实际上将数据和视图的格式混合了到上面的字符串中。看似方便,却为我们的管理带来困难。想像一个成熟的网站,其显示格式会有许多重复的地方。如果可以把数据和视图格式分离,就可以重复使用同一视图格式了。

Django中自带的模板系统,可以将视图格式分离出来,作为模板使用。这样,不但视图可以容易修改,程序也会显得美观大方。

“她是我心中最美的人”,姜戈对德国人说。

模板初体验

我们拿一个独立的templay.html文件作为模板。它放在templates/west/文件夹下。文件系统的结构现在是:

1

2

3

4

5

mysite/

├── mysite

├── templates

│   └── west

└── west

templay.html文件的内容是:

1

h1>{{ label }}h1>

可以看到,这个文件中,有一个奇怪的双括号包起来的陌生人。这就是我们未来数据要出现的地方。而相关的格式控制,即

标签,则已经标明在该模板文件中。

我们需要向Django说明模板文件的搜索路径,修改mysite/settings.py,添加:

1

2

3

4

# Template dir

TEMPLATE_DIRS = (

os.path.join(BASE_DIR, ‘templates/west/‘),

)

如果还有其它的路径用于存放模板,可以增加该元组中的元素,以便Django可以找到需要的模板。

我们现在修改west/views.py,增加一个新的对象,用于向模板提交数据:

1

2

3

4

5

6

7

8

9

# -*- coding: utf-8 -*-

#from django.http import HttpResponse

from django.shortcuts import render

def templay(request):

context          = {}

context[‘label‘] = ‘Hello World!‘

return render(request, ‘templay.html‘, context)

可以看到,我们这里使用render来替代之前使用的HttpResponse。render还使用了一个词典context作为参数。这就是我们的数据。

context中元素的键值为’label’,正对应刚才的“陌生人”的名字。这样,该context中的‘label’元素值,就会填上模板里的坑,构成一个完整的http回复。

作为上节内容的一个小练习,自行修改west/urls.py,让http://127.0.0.1:8000/west/templay的URL请求可以找到相应的view对象。

访问http://127.0.0.1:8000/west/templay,可以看到页面:

“我给你讲个故事吧,勇士拯救公主的故事”,德国人说。

流程

再来回顾一下整个流程。west/views.py中的templay()在返回时,将环境数据context传递给模板templay.html。Django根据context元素中的键值,将相应数据放入到模板中的对应位置,生成最终的http回复。

这一模板系统可以与Django的其它功能相互合作。上一回,我们从数据库中提取出了数据。如果将数据库中的数据放入到context中,那么就可以将数据库中的数据传送到模板。

修改上次的west/views.py中的staff:

1

2

3

4

5

def staff(request):

staff_list  = Character.objects.all()

staff_str  = map(str, staff_list)

context   = {‘label‘: ‘ ‘.join(staff_str)}

return render(request, ‘templay.html‘, context)

练习: 显示上面的staff页面。

“勇士翻过高山,并非因为他不害怕。”

循环与选择

Django实际上提供了丰富的模板语言,可以在模板内部有限度的编程,从而更方便的编写视图和传送数据。

我们下面体验一下最常见的循环与选择。

上面的staff中的数据实际上是一个数据容器,有三个元素。刚才我们将三个元素连接成一个字符串传送。

实际上,利用模板语言,我们可以直接传送数据容器本身,再循环显示。修改staff()为:

1

2

3

def staff(request):

staff_list = Character.objects.all()

return render(request, ‘templay.html‘, {‘staffs‘: staff_list})

从数据库中查询到的三个对象都在staff_list中。我们直接将staff_list传送给模板。

将模板templay.html修改为:

1

2

3

{% for item in staffs %}

p>{{ item.id }}, {{item}}p>

{% endfor %}

我们以类似于Python中for循环的方式来定义模板中的for,以显示staffs中的每个元素。

还可以看到,对象.属性名的引用方式可以直接用于模板中。

选择结构也与Python类似。根据传送来的数据是否为True,Django选择是否显示。使用方式如下:

1

2

3

4

5

6

7

{% if condition1 %}

... display 1

{% elif condiiton2 %}

... display 2

{% else %}

... display 3

{% endif %}

其中的elif和else和Python中一样,是可以省略的。

“勇士屠杀恶龙,并非因为他不恐惧。”

模板继承

模板可以用继承的方式来实现复用。我们下面用templay.html来继承base.html。这样,我们可以使用base.html的主体,只替换掉特定的部分。

新建templates/west/base.html:

1

2

3

4

5

6

7

8

9

10

11

12

<html>

head>

title>templaytitle>

<head>

<body>

h1>come from base.htmlh1>

{% block mainbody %}

p>originalp>

{% endblock %}

<body>

<html>

该页面中,名为mainbody的block标签是可以被继承者们替换掉的部分。

我们在下面的templay.html中继承base.html,并替换特定block:

1

2

3

4

5

6

7

8

9

{% extends "base.html" %}

{% block mainbody %}

{% for item in staffs %}

p>{{ item.id }},{{ item.name }}p>

{% endfor %}

{% endblock %}

第一句说明templay.html继承自base.html。可以看到,这里相同名字的block标签用以替换base.html的相应block。

“勇士穿过地狱火焰,因为,她值得。”

总结

使用模板实现视图分离。

数据传递,模板变量,模板循环与选择,模板继承。

时间: 2024-08-01 10:46:30

Python 快速教程(Django03): 所谓伊人的相关文章

Python快速教程

Python快速教程 作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 怎么能快速地掌握Python?这是和朋友闲聊时谈起的问题. Python包含的内容很多,加上各种标准库.拓展库,乱花渐欲迷人眼.我一直希望写一个快速的.容易上手的Python教程,而且言语简洁,循序渐进,让没有背景的读者也可以从基础开始学习.我将在每一篇中专注于一个小的概念,希望在闲暇时可以很快读完. 小提醒 教程将专注于Python基础,语法基于Pytho

Python快速教程 尾声(转)

原文地址: http://www.cnblogs.com/vamei/p/3603046.html 作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 写了将近两年的Python快速教程,终于大概成形.这一系列文章,包括Python基础.标准库.Django框架.前前后后的文章,包含了Python最重要的组成部分.这一内容的跨度远远超过我的预期,也超过了我看过的任何Python相关书籍.最初动笔的原因,除了要总结,还对很多Pyth

Python 快速教程(补充篇04): Python简史

Python的起源 Python的作者,Guido von Rossum,确实是荷兰人.1982年,Guido从阿姆斯特丹大学(University of Amsterdam)获得了数学和计算机硕士学位.然而,尽管他算得上是一位数学家,但他更加享受计算机带来的乐趣.用他的话说,尽管拥有数学和计算机双料资质,他总趋向于做计算机相关的工作,并热衷于做任何和编程相关的活儿. Guido von Rossum 在那个时候,他接触并使用过诸如Pascal.C. Fortran等语言.这些语言的基本设计原则

给深度学习入门者的Python快速教程

基础篇 numpy和Matplotlib篇 本篇部分代码的下载地址: https://github.com/frombeijingwithlove/dlcv_for_beginners/tree/master/chap5 5.3 Python的科学计算包 – Numpy numpy(Numerical Python extensions)是一个第三方的Python包,用于科学计算.这个库的前身是1995年就开始开发的一个用于数组运算的库.经过了长时间的发展,基本上成了绝大部分Python科学计算

Python 快速教程(补充篇03): Python内置函数清单

Python内置(built-in)函数随着python解释器的运行而创建.在Python的程序中,你可以随时调用这些函数,不需要定义.最常见的内置函数是: print(“Hello World!”) 在Python教程中,我们已经提到下面一些内置函数: 基本数据类型 type() 反过头来看看 dir() help() len() 词典 len() 文本文件的输入输出 open() 循环设计 range() enumerate() zip() 循环对象 iter() 函数对象 map() fi

给深度学习入门者的Python快速教程 - 基础篇

实在搞不定博客园的排版,排版更佳的版本在: https://zhuanlan.zhihu.com/p/24162430 Life is short, you need Python 人生苦短,我用Python -- Bruce Eckel 5.1 Python简介 本章将介绍Python的最基本语法,以及一些和深度学习还有计算机视觉最相关的基本使用. 5.1.1 Python简史 Python是一门解释型的高级编程语言,特点是简单明确.Python作者是荷兰人Guido van Rossum,1

Python 快速教程(Django05):黑面管家

Django提供一个管理数据库的app,即django.contrib.admin.这是Django最方便的功能之一.通过该app,我们可以直接经由web页面,来管理我们的数据库.这一工具,主要是为网站管理人员使用. 这个app通常已经预装好,你可以在mysite/settings.py中的INSTALLED_APPS看到它. "这庄园里的事情,都逃不过我的眼睛",管家放下账本,洋洋得意. 默认界面 admin界面位于[site]/admin这个URL.这通常在mysite/urls.

Python 快速教程(Django06):假作真时

之前了解了: 创建Django项目 数据库 模板 表格提交 admin管理页面 上面的功能模块允许我们做出一个具有互动性的站点,但无法验证用户的身份.我们这次了解用户验证部分.通过用户验证,我们可以根据用户的身份,提供不同的服务. 一个Web应用的用户验证是它的基本组成部分.我们在使用一个应用时,总是从"登录"开始,到"登出"结束.另一方面,用户验证又和网站安全.数据库安全息息相关.HTTP协议是无状态的,但我们可以利用储存在客户端的cookie或者储存在服务器的s

Python 快速教程(Django07):马不停蹄

前面的文章研究了Django最主要的几个方面:数据库,模板,动态生成页面等.但都是使用python manage.py runserver来运行服务器.这是一个实验性的web服务器,不适用于正常的站点运行.我们需要一个可以稳定而持续的服务器.这个服务器负责监听http端口,将收到的请求交给Django处理,将Django的回复发还给客户端. 这样的持续性服务器可以有很多选择,比如apache, Nginx, lighttpd等.这里将使用最常见的apache服务器.服务器和Django之间通过P