1、使用模板继承(方便管理和修改等操作)
父模板:创建/learning_log/learning_logs/templates/learning_logs/base.html
<p>
<a href="{% url 'learning_logs:index'%}">Leaning Log</a>
</p>
{% block content %}{% endblock content %}
使用了模板标签{%%},使其中间可以使用命名空间learning_logs,index是该命名空间的一个URL模式;
使用了一对块标签,该块名为content,是一个占位符,包含信息可由子模板指定;
子模板:(模板每个层级通常为缩进两个空格)
重写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 %>
2、显示所有主题的页面
URL模式:修改/learning_logs/urls.py定义显示所有主题页面的URL http://localhost:8080/topics/
urlpatterns = [
# 主页
url(r'^$', views.index, name = 'index'),
#显示所有主题
url(r'^topics/$', views.topics, name = 'topics'),
]
视图:修改/learning_log/learning_logs/views.py,函数topics()需要将数据库部分数据发送给模板;
from django.shortcuts import render
from .models import Topic
# Create your views here.
def index(request):
"""学习笔记的主页"""
return render(request, 'learning_logs/index.html')
def topics(request):
"""显示所有主题"""
topics = Topic.objects.order_py('date_added')
context = {'topics':topics}
return render(request, 'learning_logs/topics.html', context)
模板:创建/learning_log/learning_logs/templates/learning_logs/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 %}
在父模板base.html中添加链接
<a href = "{% url 'learning_logs:topics'%}">Topics</a>
3、显示特定主题页面
URL模式:(使用主题id属性)修改/learning_logs/urls.py
"""定义learning_logs的URL模式"""
from django.conf.urls import url
from . import views
app_name = 'learning_logs'
urlpatterns = [
# 主页
url(r'^$', views.index, name = 'index'),
#显示所有主题
url(r'^topics/$', views.topics, name = 'topics'),
#显示特定主题
url(r'^topics/(?P<topic_id>\d+)/$', views.topic, name = 'topic'),
]
解读 r'^topics/(?P<topic_id>\d+)/$' 正则表达式:r让python将接下来的字符串视为原始字符串,引号告诉python该正则表达式始于何处、终于何处,脱字符^让python查看字符串的开头,$查看字符串的末尾;/(?P<topic_id>\d+)/与包含在两个斜杠内的整数匹配并将该整数存储在topic_id实参中,两边括号()捕获URL的值,?P<topic_id>将匹配的值存储到topic_id,表达式\d+与包含在两个斜杠内的任何数字都匹配。
视图:(函数topic从数据库获取指定主题及相关的条目)修改/learning_log/learning_logs/views.py
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)
模板:创建/learning_log/learning_logs/templates/learning_logs/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 %}
Django中“|”表示模板过滤器:过滤器date格式化显示时间戳;过滤器linebreaks将包含换行符的长条目转换为浏览器能够理解的格式。
将显示所有主题的页面中的每个主题都设置为链接:修改/learning_log/learning_logs/templates/learning_logs/topics.html
{% extends "learning_logs/base.html" %}
{% block content %}
<p>Topics</p>
<!-->创建无序列表</-->
<ul>
{% for topic in topics %}
<li><a href="{% url 'learning_logs:topic' topic.id %}">{{topic}}</li>
{% empty %}
<li>No topics have been added yet.</li>
{% endfor %}
</ul>
{% endblock content %}