Python Web开发:模型数据过滤、排序和渲染
来自CloudWiki
背景
在读取模型数据时,需要根据不同的产品类型提取不同的数据
这就用到了过滤
django为模型提供了方便的数据过滤和排序功能,其核心函数分别为filter()和orderby()
实训步骤
视图函数的过滤和排序
productsApp/views.py :
from django.shortcuts import render from django.shortcuts import HttpResponse from .models import Product # Create your views here. def products(request,productName): submenu = productName if productName == 'robot': productName = '家用机器人' elif productName == 'monitor': productName = '智能监控' else: productName = '人脸识别解决方案' productList = Product.objects.all().filter( productType = productName).order_by('-publishDate') return render( request,'productList.html',{ 'active_menu':'products', 'sub_menu':submenu, 'productName':productName, 'productList':productList, })
product.objects.all():获取所有产品数据
filter():按指定条件过滤
order_by():数据排序,publishDate前面的负号表示按照时间由近及远排序
render():添加到的变量productList用于将查询到的数据集变量添加到模板中进行渲染。
前端页面的渲染
productList.html
在页面主体<div class="model-details">标签内添加代码如下:
{% for product in productList %} <div class="row"> <div class="col-md-6"> {% for img in product.productImgs.all %} {% if forloop.first %} <a href="#" class="thumbnail row-4"> <img class="img-responsive" src="{{img.photo.url}}"> </a> {% endif %} {% endfor %} </div> <div class="col-md-6"> <h3>{{ product.title|truncatechars:"20" }}</h3> <p>{{ product.description|truncatechars:"150"|linebreaks }}</p> <div class="thumbnail row-5"> <div class="caption"> <a href="#" class="btn btn-primary" role="button"> 查看详情 </a> </div> </div> </div> </div> {% endfor %}
- {% for product in productList %} :遍历传入的产品列表
- {% for img in product.productImgs.all %}:遍历产品图片
- {% if forloop.first %}判断是否是第一张产品图片
- 文字部分采用{{product.title}}来实现,truncatechars为过滤器,linebreak过滤器
- django采用了三十多种过滤器。
CSS修饰
由于这些美化样式是专门针对产品列表页面的,
因此在style.css同目录下创建一个products.css,添加如下代码:
.model-details .row-4 { Margin-top: 20px; } .model-details .row-5 { border:none; }
然后在productList.html文件的{% block content %}内,引入products.css
<link href="{% static 'css/products.css' %}" rel="stylesheet">
保存所有修改,启动项目,查看页面效果。