通过模板继承创建其他页面
父模板
在index.html所在目录创建一个base.html
这个模板包含所有页面都有的元素,而其他模板都继承它。
当前,所有页面都包含的元素只有顶端的标题。因为每个页面都包含这个模板,所以将这个标题设置为到主页的链接:
base.html
<p>
<a href="{% url 'learning_logs:index' %}">Learning Log</a>
</p>
{% block content %}{% endblock content %}
{% %}为模板标签 ,生成要在页面中显示的信息。这里的模板标签{% url 'learning_logs:index' %} 生成一个URL,该URL与在learning_logs/urls.py中定义的名为'index' 的URL模式匹配。learning_logs 是一个命名空间 ,而index 是该命名空间中一个名称独特的URL模式。
在简单的HTML页面中,链接是使用锚 标签<a> 定义的,如:<a href="link_url">link text</a>
子模板
向index.html添加如下代码,继承base.html
index.html
{% extends "learning_logs/base.html" %}
{% block content %}
<p>Learning Log helps you keep track of your learning, for any topic you're
learning about.</p>
{% endblock content %}
子模板的第一行必须包含标签{% extends %} ,让Django知道它继承了哪个父模板。
{% block %} 标签,定义content 块。
URL模式
修改learning_logs/urls.py,定义显示所有主题的页面的URL,这里用topics。
urls.py
"""为learning_logs定义URL模式。"""
--snip--
urlpatterns = [
# 主页
path('', views.index, name='index'),
# 显示所有的主题。
path('topics/', views.topics, name='topics'),
]
视图
修改视图views,函数topics() 需要从数据库中获取一些数据,并将其交给给模板。
views.py
from django.shortcuts import render
from .models import Topic
def index(request):
--snip--
def topics(request):
"""显示所有的主题。"""
topics = Topic.objects.order_by('date_added')
context = {'topics': topics}
return render(request, 'learning_logs/topics.html', context)
定义一个将发送给模板的上下文。上下文 是一个字典,其中的键是将在模板中用来访问数据的名称,而值是要发送给模板的数据。
这里只有一个键值对,包含一组将在页面中显示的主题。创建使用数据的页面时,除了对象request 和模板的路径外,还将变量context 传递给render()。
模板
在index.html所在的目录中,创建一个topics.html,来接受字典context ,和使用topics() 提供的数据。
topics.html
{% extends "learning_logs/base.html" %}
{% block content %}
<p>Topics</p>
<ul>
{% for topic in topics %}
<li>{{ topic }}</li>
{% empty %}
<li>No topics have been added yet.</li>
{% endfor %}
</ul>
{% endblock content %}
标签<ul></ul>为无序列表。
for 循环的模板标签遍历字典context 中的列表topics。
要在模板中打印变量,需要将变量名用双花括号括起。因此每次循环时{{ topic }} 都被替换为topic 的当前值。
模板标签{% empty %} ,它告诉Django在列表topics 为空时该如何办。这里是打印一条消息,告诉用户还没有添加任何主题。
最后,修改父模板,使其包含到显示所有主题的页面的链接:
base.html
<p>
<a href="{% url 'learning_logs:index' %}">Learning Log</a> -
<a href="{% url 'learning_logs:topics' %}">Topics</a>
</p>
{% block content %}{% endblock content %}
在到主页的链接后面添加一个连字符“-”,再添加一个到显示所有主题的页面的链接,使用的也是模板标签{% url %} 。这行让Django生成一个链接,它与learning_logs/urls.py中名为'topics' 的URL模式匹配。
现在如果刷新浏览器中的主页,将看到链接Topics。如果单击这个链接,将显示子页面。