Python Web编程(五)
这一节主要学习模板的继承,然后通过做一个例子来实际应用一下。
上一节给hour_offset创建了一个模板,下面我们把current_datetime的模板修改成类似的。
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN">
<html lang="en">
<head>
<title>The current time</title>
</head>
<body>
<h1>My helpful timestamp site</h1>
<p>It is now {{ current_date }}.</p>
<hr>
<p>Thanks for visiting my site.</p>
</body>
</html>
注意了,这两个模板的区别就是<body>中的内容不一样。
在一个大型的应用上,网页的风格都是一样的,有相同的Head,相同的Bar等,
那我们不能每一个模板都写上相同的HTML吧,还好,Django早就想到这个问题了。
我们可以把相同的部分拿出来,放到一个base.html中,
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN">
<html lang="en">
<head>
<title>{% block title %}{% endblock %}</title>
</head>
<body>
<h1>My helpful timestamp site</h1>
{% block content %}{% endblock %}
{% block footer %}
<hr>
<p>Thanks for visiting my site.</p>
{% endblock %}
</body>
</html>
然后修改current_datetime.html:
{% extends "base.html" %}
{% block title %}The current time{% endblock %}
{% block content %}
<p>It is now {{ current_date }}.</p>
{% endblock %}
呵呵,是不是显得简练了。
同样的,hour_offset.html也可以作如下修改:
{% extends "base.html" %}
{% block title %}Future time{% endblock %}
{% block content %}
<p>In {{ hour_offset }} hour(s), it will be {{ next_time }}.</p>
{% endblock %}
突然感觉有点重构的味道,一步步从最基本的代码,到现在有了一些结构,这样的学习过程很好啊。
接下来就做一个例子吧。
新建一个文件:musician.py,内容如下:
from django.shortcuts import render_to_response
MUSICIANS = [
{'name': 'Django Reinhardt', 'genre': 'jazz'},
{'name': 'Jimi Hendrix', 'genre': 'rock'},
{'name': 'Louis Armstrong', 'genre': 'jazz'},
{'name': 'Pete Townsend', 'genre': 'rock'},
{'name': 'Yanni', 'genre': 'new age'},
{'name': 'Ella Fitzgerald', 'genre': 'jazz'},
{'name': 'Wesley Willis', 'genre': 'casio'},
{'name': 'John Lennon', 'genre': 'rock'},
{'name': 'Bono', 'genre': 'rock'},
{'name': 'Garth Brooks', 'genre': 'country'},
{'name': 'Duke Ellington', 'genre': 'jazz'},
{'name': 'William Shatner', 'genre': 'spoken word'},
{'name': 'Madonna', 'genre': 'pop'},
]
def musician_list(request):
return render_to_response('musician_list.html', {'musicians': MUSICIANS})
然后建一个模板,musician_list.html:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN">
<html lang="en">
<head>
<title>Musician list</title>
</head>
<body>
<table>
<tr><th>Musician</th><th>Genre</th></tr>
{% for musician in musicians %}
<tr>
<td>{{ musician.name }}</td>
<td>{{ musician.genre }}</td>
</tr>
{% endfor %}
</table>
</body>
</html>
最后在urls.py中加入URL:
(r'^musician/$', 'test1.musician.musician_list'),
好了,http://localhost/musician/,试一下吧。
这里面用到了for标签,它可以遍历一个容器里面的对象,跟Python里面的for是差不多的。