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">

保存所有修改,启动项目,查看页面效果。

Python21051106.png