Django模型、模板和视图

 创建数据驱动页面的流程

在 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 %} ࿰

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值