创建数据驱动页面的流程
在 Django 中创建数据驱动页面主要分为 5 步:
➊ 在 views.py 文件中导入想使用的模型。
➋ 在视图函数中查询模型,获取想呈现的数据。
➌ 把从模型获取的数据传给模板上下文。
➍ 创建或修改模板,显示上下文中的数据。
➎ 把 URL 映射到视图上(如果还未做的话)。
以上就是在 Django 框架中把模型、视图和模板连接在一起的步骤。
在首页显示分类
客户对主页的要求之一是显示最受欢迎的 5 个分类。下面根据上述步骤实现这一要求。
导入所需的模型
首先完成第一步。打开 rango/views.py 文件,在顶部其他导入语句之后从 Rango 应用的 models.py
文件中导入 Category 模型:
# 导入 Category 模型
from rango.models import Category
修改 index 视图
下面完成第 2 步和第 3 步。我们要修改主页的视图函数,即 index() 。根据下述代码修改。
def index(request):
# 查询数据库,获取目前存储的所有分类
# 按点赞次数倒序排列分类
# 获取前 5 个分类(如果分类数少于 5 个,那就获取全部)
# 把分类列表放入 context_dict 字典
# 稍后传给模板引擎
category_list = Category.objects.order_by('-likes')[:5]
context_dict = {'categories': category_list}
# 渲染响应,发给客户端
return render(request, 'rango/index.html', context_dict)
这里的 Category.objects.order_by('-likes')[:5] 从 Category 模型中查询最受欢迎的前 5 个分
类。 order_by() 方法的作用是排序,这里我们根据 likes 字段的值倒序排列。 -likes 中的 - 号表
示倒序(如果没有 - 号,返回的结果是升序排列的)。因为我们想获得一个分类对象列表,所以
使用 Python 的列表运算符从列表中获取前 5 个对象( [:5] ),返回一个 Category 对象子集。
查询结束后,把列表的引用( category_list 变量)传给 context_dict 字典。最后把这个字典作
为模板上下文传给 render() 函数。
修改 index 模板
更新视图之后,接下来要做第 4 步,更新项目根目录中 templates 目录里的 rango/index.html 模
板。根据下述代码片段修改模板中的 HTML。
<!DOCTYPE html>
{% load staticfiles %}
<html>
<head>
<title>Rango</title>
</head>
<body>
<h1>Rango says...</h1>
<div>hey there partner!</div>
<div>
{% if categories %}
<ul>
{% for category in categories %}
<li>{
{ category.name }}</li>
{% endfor %}
</ul>
{% else %}
<strong>There are no categories present.</strong>
{% endif %}
</div>
<div>
<a href="/rango/about/">About Rango</a><br />
<img src="{% static "images/rango.jpg" %}" alt="Picture of Rango" />
</div>
</body>
</html>
这里,我们使用 Django 模板语言提供的 if 和 for 控制语句呈现数据。在页面的 <body> 元素中,
我们判断 categories (包含分类列表的上下文变量)中有没有分类( {% if categories %}