378第18章 Django入门
18.4.3显示特定主题的页面
接下来,我们需要创建一个专注于特定主题的页面——显示该主题的名称及该主题的所有条目。同样,我们将定义一个新的URL模式,编写一个视图并创建一个模板。我们还将修改显示所有主题的网页,让每个项目列表项都是一个链接,单击它将显示相应主题的所有条目。
1. URL模式
显示特定主题的页面的URL模式与前面的所有URL模式都稍有不同,因为它将使用主题的id 属性来指出请求的是哪个主题。例如,如果用户要查看主题Chess(其id为1)的详细页面,URL 将为localhost:8000/topics/1/。下面是与这个URL匹配的模式,它包含在learning_logs/urls.py中:
urls.py
--snip--
urlpatterns = [
--snip--
# 特定主题的详细页面
url(r'^topics/(?P<topic_id>\d+)/$', pic, name='topic'),
]
我们来详细研究这个URL模式中的正则表达式——r'^topics/(?P<topic_id>\d+)/$'。r让Django将这个字符串视为原始字符串,并指出正则表达式包含在引号内。这个表达式的第二部分(/(?P<topic_id>\d+)/)与包含在两个斜杠内的整数匹配,并将这个整数存储在一个名为topic_id 的实参中。这部分表达式两边的括号捕获URL中的值;?P<topic_id>将匹配的值存储到topic_id 中;而表达式\d+与包含在两个斜杆内的任何数字都匹配,不管这个数字为多少位。
发现URL与这个模式匹配时,Django将调用视图函数topic(),并将存储在topic_id中的值作为实参传递给它。在这个函数中,我们将使用topic_id的值来获取相应的主题。
2. 视图
函数topic()需要从数据库中获取指定的主题以及与之相关联的所有条目,如下所示:
views.py
--snip--
◆ def topic(request, topic_id):
"""显示单个主题及其所有的条目"""
topic = (id=topic_id)
json格式如何书写
♦    entries = _der_by('-date_added')
⌧    context = {'topic': topic, 'entries': entries}
⍓    return render(request, 'learning_logs/topic.html', context)
这是第一个除request对象外还包含另一个形参的视图函数。这个函数接受正则表达式(?P<topic_id>\d+)捕获的值,并将其存储到topic_id中(见◆)。在 处,我们使用get()来获取指定的主题,就像前面在Django shell中所做的那样。在♦处,我们获取与该主题相关联的条目,并将它们按date_added排序:date_added前面的减号指定按降序排列,即先显示最近的条目。我
18.4 创建其他网页  379
2 3 4 5 20
6 7 9 10 11 12 13 14 15 16 17 18 19 们将主题和条目都存储在字典context 中(见⌧),再将这个字典发送给模板topic.html (见⍓)。 注意  处和♦处的代码被称为查询,因为它们向数据库查询特定的信息。在自己的项目中编
写这样的查询时,先在Django shell 中进行尝试大有裨益。相比于编写视图和模板,再在浏览器中检查结果,在shell 中执行代码可更快地获得反馈。 3. 模板
这个模板需要显示主题的名称和条目的内容;如果当前主题不包含任何条目,我们还需向用户指出这一点:
topic.htmlwordpress完整视频教程
{% 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>{{ linebreaks }}</p>    </li>    {% empty %}    <li>
mysql图形化安装There are no entries for this topic yet.    </li>
python入门教程(非常详细)书
{% endfor %}  </ul>
{% endblock content %}
像这个项目的其他页面一样,这里也继承了base.html 。接下来,我们显示当前的主题(见◆),它存储在模板变量{{ topic }}中。为什么可以使用变量topic 呢?因为它包含在字典context 中。接下来,我们开始定义一个显示每个条目的项目列表(见 ),并像前面显示所有主题一样遍历条目(见♦)。
每个项目列表项都将列出两项信息:条目的时间戳和完整的文本。为列出时间戳(见⌧),我们显示属性date_added 的值。在Django 模板中,竖线(|)表示模板过滤器——对模板变量的值进行修改的函数。过滤器date: 'M d, Y H:i'以这样的格式显示时间戳:January 1, 2015 23:00。接下来的一行显示text 的完整值,而不仅仅是entry 的前50个字符。过滤器linebreaks (见⍓)将包含换行符的长条目转换为浏览器能够理解的格式,以免显示为一个不间断的文本块。在 处,我们使用模板标签{% empty %
}打印一条消息,告诉用户当前主题还没有条目。
380第18章 Django入门
4. 将显示所有主题的页面中的每个主题都设置为链接
在浏览器中查看显示特定主题的页面前,我们需要修改模板topics.html,让每个主题都链接到相应的网页,如下所示:
topics.html
负数的补码是负数吗--snip--
{% for topic in topics %}
<li>
<a href="{% url 'learning_logs:topic' topic.id %}">{{ topic }}</a>
</li>
{% empty %}
--snip--
我们使用模板标签url根据learning_logs中名为topic的URL模式来生成合适的链接。这个URL模式要求提供实参topic_id,因此我们在模板标签url中添加了属性topic.id。现在,主题列表中的每个主题都是一个链接,链接到显示相应主题的页面,如localhost:8000/topics/1/。
如果你刷新显示所有主题的页面,再单击其中的一个主题,将看到类似于图18-5所示的页面。
图18-5特定主题的详细页面,其中显示了该主题的所有条目
动手试一试
18-7 模板文档:请浏览Django模板文档,其网址为docs.djangoproject/ en/1.8/ref/temp lates/。自己开发项目时,可再回过头来参考该文档。
18-8 比萨店页面:在练习18-6中开发的项目Pizzeria中添加一个页面,它显示供应的比萨的名称。然后,将每个比萨名称都设置成一个链接,单击这种链接将显示一个页
面,其中列出了相应比萨的配料。请务必使用模板继承来高效地创建页面。
18.5 小结  381
2 3 4 5 20
6 7 9 10 11 12 13 14 15 16 17 18 19 18.5 小结
在本章中,你首先学习了如何使用Django 框架来创建Web 应用程序。你制定了简要的项目规范,在虚拟环境中安装了Django ,创建了一个项目,并核实该项目已正确地创建。你学习了如何创建应用程
序,以及如何定义表示应用程序数据的模型。你学习了数据库,以及在你修改模型后,Django 可为你迁移数据库提供什么样的帮助。你学习了如何创建可访问管理网站的超级用户,并使用管理网站输入了一些初始数据。
你还探索了Django shell ,它让你能够在终端会话中处理项目的数据。你学习了如何定义URL 、创建视图函数以及编写为网站创建网页的模板。最后,你使用了模板继承,它可简化各个模板的结构,并使得修改网站更容易。
在第19章,我们将创建对用户友好而直观的网页,让用户无需通过管理网站就能添加新的主题和条目,以及编辑既有的条目。我们还将添加一个用户注册系统,让用户能够创建账户和自己的学习笔记。让任意数量的用户都能与之交互,是Web 应用程序的核心所在。
Web应用程序的核心是让任何用户都能够注册账户并能够使用
它,不管用户身处何方。在本章中,你将创建一些表单,让用户能
够添加主题和条目,以及编辑既有的条目。你还将学习Django如何
防范对基于表单的网页发起的常见攻击,这让你无需花太多时间考
虑确保应用程序安全的问题。
然后,我们将实现一个用户身份验证系统。你将创建一个注册
页面,供用户创建账户,并让有些页面只能供已登录的用户访问。
接下来,我们将修改一些视图函数,使得用户只能看到自己的数据。
linuxshell多个if
你将学习如何确保用户数据的安全。
19.1让用户能够输入数据
建立用于创建用户账户的身份验证系统之前,我们先来添加几个页面,让用户能够输入数据。我们将让用户能够添加新主题、添加新条目以及编辑既有条目。
当前,只有超级用户能够通过管理网站输入数据。我们不想让用户与管理网站交互,因此我们将使用Django的表单创建工具来创建让用户能够输入数据的页面。
19.1.1添加新主题
首先来让用户能够添加新主题。创建基于表单的页面的方法几乎与前面创建网页一样:定义一个URL,编写一个视图函数并编写一个模板。一个主要差别是,需要导入包含表单的模块forms.py。
1. 用于添加主题的表单
让用户输入并提交信息的页面都是表单,那怕它看起来不像表单。用户输入信息时,我们需要进行验证,确认提供的信息是正确的数据类型,且不是恶意的信息,如中断服务器的代码。然后,我们再对这些有效信息进行处理,并将其保存到数据库的合适地方。这些工作很多都是由Django自动完成的。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。