1.url模式
显示特定主题的页面的URL模式与前面的所有URL模式都稍有不同,因为它将使用主题的id 属性来指出请求的是哪个主题。例如,如果用户要查看主题Chess(其id 为1)的详细
页面,URL将为http://localhost:8000/topics/1/。下面是与这个URL匹配的模式,它包含在learning_logs/urls.py中:
"""定义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')
]
(?P
Django将调用视图函数topic() ,并将存储在topic_id 中的值作为实参传递给它
2.视图
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)
这是第一个除request 对象外还包含另一个形参的视图函数。这个函数接受正则表达式(?P
我 们使用get() 来获取指定的主题,就像前面在Django shell中所做的那样
我们获取与该主题相关联的条目,并将它们按date_added 排序:date_added 前面的减号指定按降序排列,即先显示最近的条目
我们将主题和条目都存储在字典context 中,再将这个字典发送给模板topic.html
3.模版
{
% 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%}
我们显示当前的主题,它存储在模板变量{ { topic }}中。为什么可以使用变量topic呢?因为它包 含在字典context 中
每个项目列表项都将列出两项信息:条目的时间戳和完整的文本。在Django模板中,竖线(| )表示模板过滤器—— 对模板变量的值进行修改的函数。
过滤器date: 'M d, Y H:i’以这样的格式显示时间戳:January1,201523:00。接下来的一行显示text的完整值,而不仅仅是entry的前 50个字符。过滤器linebreaks将包含换行符的长条目转换为浏览器能够理解的格式,以免显示为一个不间断的文本块。
4.将显示所有主题的页面中的每个主题都设置为链接
在浏览器中查看显示特定主题的页面前,我们需要修改模板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 }}</a>
</li>
{
%empty%}
<li>No topics have been added yet.</li>
{
% endfor %}
</ul>
{
% endblock content %}
**我们使用模板标签url 根据learning_logs中名为topic 的URL模式来生成合适的链接。这个URL模式要求提供实参topic_id ,因此我们在模板标签url 中添加了属性topic.id 。现在,主题列表中的每个主题都是一个链接,链接到显示相应主题的页面,如http://localhost:8000/topics/1/。
**