4. 创建其他页面
创建两个显示数据的页面,一个列出所有的主题,一个显示特定主题的所有条目。
4-1 模板继承
父模板
包含通用元素,每个页面都将继承这个模板。
base.html
<p>
<a href="{% url 'learning_logs:index' %}">Learning Log</a> -
<a href="{% url 'learning_logs:topics' %}">Topic</a>
</p>
{% block content %}{% endblock content %} <!--块标签,是一个占位符;块名为content-->
{% %}模板标签
learning_logs是一个
命名空间
,index是该
命名空间
中一个名称独特的URL模式。
锚
标签定义链接<a href=”link_url”>link text</a>
子模板
index.heml
{% 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 %}
4-2 显示所有主题的页面
URL模式
learning_logs/urls.py
"""定义learning_logs的URL模式"""
from django.urls import path
from . import views # 句点让Python从当前urls.py模块所在的文件夹导入views.py
app_name = 'learning_logs' #区分其他应用程序中的同名文件
urlpatterns = [
# 主页
path('', views.index, name='index'),
# 显示所有的主题
path('topics/', views.topics, name='topics'),
]
添加了topics/
视图
函数topics()需要从数据库中获取一些数据,并交给模板。
views.py
from django.shortcuts import render
from .models import Topic # 导入模型
def index(request):
"""学习笔记的主页"""
return render(request, 'learning_logs/index.html')
def topics(request):
"""显示所有的主题"""
topics = Topic.objects.order_by('date_added') # 查询数据库————请求提供Topic对象,并根据属性date_added进行排序
comtext = {'topics':topics} # 定义一个将发送给模板的上下文
return render(request, 'learning_logs/topics.html', comtext)
上下文
(context)是一个字典,键:将在模板中用来访问数据名称。值:要发送给模板的数据。
模板
接受字典context,以便使用topic()提供的数据。
topics.html
{% extends "learning_logs/base.html" %}
{% block content %}
<p>Topics</p>
<ul>
{% for topic in topics %} <!--for循环-->
<li>{{ topic }}</li>
{% empty %} <!--列表为空时-->
<li>No topics have been added yet</li>
{% endfor %}
</ul>
{% endblock content %}
<ul></ul>
无序列表
for循环遍历字典context中的列表topics。
{
{ topic }}
模板变量
,打印变量值。
<li></li>
项目列表项
修改父模板
base.html
<p>
<a href="{% url 'learning_logs:index' %}">Learning Log</a> -
<a href="{% url 'learning_logs:topics' %}">Topic</a>
</p>
{% block content %}{% endblock content %} <!--块标签,是一个占位符;块名为content-->
‘-‘
连字符
4-3 显示特定主题的页面
URL模式
使用主题的id属性来指出请求的是哪个主题。
learning_logs/urls.py
"""定义learning_logs的URL模式"""
from django.urls import path
from . import views # 句点让Python从当前urls.py模块所在的文件夹导入views.py
app_name = 'learning_logs' #区分其他应用程序中的同名文件
urlpatterns = [
# 主页
path('', views.index, name='index'),
# 显示所有的主题
path('topics/', views.topics, name='topics'),
# 特定主题的详细页面
path('topics/<int:topic_id>/', views.topic, name='topic'),
]
字符串’topics/<int:topic_id>/’:
第一部分查找在基础URL后包含单词topics的URL;
第二部分(/<int:topic_id>/)与包含在两个斜杠内的整数匹配。
视图
topic()需要从数据库中获取指定的主题以及与之相关联的所有条目。
views.py
from django.shortcuts import render
from .models import Topic # 导入模型
def index(request):
"""学习笔记的主页"""
return render(request, 'learning_logs/index.html')
def topics(request):
"""显示所有的主题"""
topics = Topic.objects.order_by('date_added') # 查询数据库————请求提供Topic对象,并根据属性date_added进行排序
comtext = {'topics':topics} # 定义一个将发送给模板的上下文
return render(request, 'learning_logs/topics.html', comtext)
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)
topic()的参数topic_id,接受表达式/<int:topic_id>/捕获的值。
get()获取指定的主题。-date_added按时间降序(先显示最近的)。
模板
需要显示主题名称和条目内容,如没有任何条目将给出提示。
topic.html
{% extends 'learning_logs/base.html' %}
{% block content %}
<p>Topic: {{ topic }}</p>
<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 %}
竖线( | )表示模板
过滤器
,即对模板变量的值进行修改的函数。
date:’M d, Y H:i’ 时间格式。(例如:January 1,2008 23:00)
linebreaks 将包含换行符的
长条目
转换为浏览器能够理解的格式,以免显示为不间断的文本块。
将显示所有的主题页面中的主题设置为链接
在浏览器中查看显示特定主题的页面前,需修改模板topics.html。让每个主题都链接到相应的页面。
topics.html
{% extends "learning_logs/base.html" %}
{% block content %}
<p>Topics</p>
<ul>
{% for topic in topics %} <!--for循环-->
<li>
<a href="{% url 'learning_logs:topic' topic.id %}">{{ topic }}<a>
</li>
{% empty %} <!--列表为空时-->
<li>No topics have been added yet</li>
{% endfor %}
</ul>
{% endblock content %}
修改前:
修改后: