每一个网页,都需要三步,指定URL模式;编写视图函数;编写模板。
4.1 模板继承
在一个项目中,通常有一个用于整个网站的父模板base.html, 并且网站的每个主要部分都有一个父模板,每个部分的父模版继承base.html, 网站的每个网页继承相应部分的父模板。这种配置便于修改网站,效率更高。
4.1.1 父模板
创建一个父模板,名字叫base.html, 将其存储在index.html所在目录中。
创建包含项目名的段落,是一个到主页index的链接.
为了创建链接,使用了一个模板标签{%%}, 模板标签{% url ‘learning_logs:index’ %}生成一个URL, 该URL与learning_logs/urls.py中命名为index的URL模式匹配。
插入一对块标签,块名为content, 是一个占位符。
<html lang="en">
<head>
<meta charset="UTF-8">
<title>basehtmltitle>
head>
<body>
<p>
<a href="{% url 'learning_logs:index' %}">Learning Loga>
p>
{% block content %}
{% endblock content %}
body>
html>
4.2.2 子模板
子模板继承父模板{% extends “learning_logs/base.html” %}
子模板的块标签中的内容写在{% block content %}与{% endblock content %}之间。
<html lang="en">
<head>
<meta charset="UTF-8">
<title>indextitle>
head>
<body>
{% extends "learning_logs/base.html" %}
{% block content %}
<p>Learning Logp>
<p>Learning Log helps you keep track of your learning, for any topic you're learning about.p>
{% endblock content %}
body>
html>
4.2 显示所有主题的页面
URL模式:
"""定义learning_logs的URL模式"""
from django.conf.urls import url
from . import views
urlpatterns = [
# 主页
url(r'^$', views.index, name='index'),
# 显示所有的主题
url(r'^topics$', views.topics, name='topics'),
]
app_name = 'learning_logs'
视图:
def topics(request):
"""显示所有的主题"""
topics = Topic.objects.order_by('date_added')
context = {'topics': topics}
return render(request, 'learning_logs/topics.html', context)
模板:
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Topicstitle>
head>
<body>
{% extends "learning_logs/base.html"%}
{% block content %}
<p>Topicsp>
<ul>
{% for topic in topics %}
<li>{{ topic }}li>
{% empty %}
<li>
话题没有被创建。
li>
{% endfor %}
ul>
{% endblock content %}
body>
html>
在模板中,循环结束用 {% endfor %}来表示。
模板中的循环:
{% for item in list %}
do something with each item
{% endfor %}
修改父模板,使其包含到子模板的链接。
<html lang="en">
<head>
<meta charset="UTF-8">
<title>basehtmltitle>
head>
<body>
<p>
<a href="{% url 'learning_logs:index' %}">Learning Loga>-
<a href="{% url 'learning_logs:topics' %}">Topicsa>
p>
{% block content %}{% endblock content %}
body>
html>
主页链接后加了一个连字符(-) ,然后添加了另一个子模版的页面链接。
4.3 显示特定主题的页面
同样地,需要定义一个URL模式,编写一个视图,创建一个模板。
URL模式:
"""定义learning_logs的URL模式"""
from django.conf.urls import url
from . import views
urlpatterns = [
# 主页
url(r'^$', views.index, name='index'),
# 显示所有的主题
url(r'^topics$', views.topics, name='topics'),
# 特定主题的详细页面
url(r'^topics/(?P\d+)/$' , views.topic, name='topic'),
]
app_name = 'learning_logs'
详细研究正则表达式r’^topics/(?P
视图:
def topic(request, topic_id):
"""显示单个主题及其所有的条目"""
topic = Topic.objects.get(id=topic_id)
entries = topic.entry_set.order_by('-date_added')
context = {'topic': topic, 'entries': entries}
return render(request, 'learning_logs/topic.html', context)
与前面的视图函数不同,views.topic()除了接收request外,还会接收特定的topic_id, 用于查询。
topic = Topic.objects.get(id=topic_id)
entries = topic.entry_set.order_by(’-date_added’)
date_added前的减号指定了按照降序排列。
模板
继承父模板:{% extends ‘learning_logs/base.html’ %}
在项目列表中,用遍历获取每个条目的时间戳和文本信息。
Django模板中的竖线(|)表示模板过滤器。
过滤器date:‘M d, Y H:i’ , 表明显示时间戳的格式,注意这里date:'M中间没有空格,否则匹配会失败。
过滤器linebreaks, 将包含换行符的条目转换成浏览器能够理解的格式。
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Topictitle>
head>
<body>
{% extends 'learning_logs/base.html' %}
{% block content %}
<p>Topicp>
<p>Entries:p>
<ul>
{% for entry in entries %}
<li>
<p>{{ entry.date_added|date:'M d, Y H:i' }}p>
<p>{{ entry.text|linebreaks }}p>
li>
{% empty %}
<li>
There are no entries for this topic yet.
li>
{% endfor %}
ul>
{% endblock content %}
body>
html>
修改模板topics.html,让每个主题都可以链接到相应的网页。
<body>
{% extends "learning_logs/base.html"%}
{% block content %}
<p>Topicsp>
<ul>
{% for topic in topics %}
<li>
<a href="{% url 'learning_logs:topic' topic.id %}">{{ topic }}a>
li>
{% empty %}
<li>
话题没有被创建。
li>
{% endfor %}
ul>
{% endblock content %}
body>
URL模式要求提供实参topic_id, 所以在模板标签url中添加属性topic.id.