博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Python3开发--26--Django项目的业务数据处理
阅读量:2035 次
发布时间:2019-04-28

本文共 3826 字,大约阅读时间需要 12 分钟。

如果直接阅读本文,您可能有些不知所云,这是因为我用很多篇幅讲了一个事情,如果想知道上下文,那么建议您从本专栏第21章看起:

一、处理首页视图函数

视图(Views)是Django的MTV架构模式下的V部分,主要负责处理用户请求和生成响应的响应业务,然后在页面或其他类型文档中显示。也可以理解为视图是MVC架构里面的C部分(控制器),主要处理功能和业务上的逻辑。我们习惯使用视图函数处理HTTP请求,即在视图里面定义def函数,这种方式称为FBV。

步骤如下:

1、修改文件:index/urls.py

from django.urls import pathfrom .views import *urlpatterns = [    # 第一个参数用于设置具体的路由地址,此处设置为空    # 第二个参数是指向index应用的views.py的某个视图函数    # 第三个参数用于命名路由地址,是个可选参数    # path('', indexView, name='index'),    path('', indexClassView.as_view(), name='index'),]

2、修改文件:index/views.py

from django.shortcuts import renderfrom commodity.models import *def indexView(request):    # 设置网页标签内容,该变量将会在模板中使用    title = '首页'    # 控制网页导航栏的样式    classContent = ''    # 查询模型commodityInfos销量最高的前8条数据    commodityInfos = CommodityInfos.objects.order_by('-sold').all()[:8]    # 查询模型Types的所有数据    types = Types.objects.all()    # 对types数据进行筛选,获取字段等于"儿童服饰"的所有数据    cl = [x.seconds for x in types if x.firsts == '儿童服饰']    # 将符合条件的数据按销量排序并获取前5条数据    clothes = CommodityInfos.objects.filter(types__in=cl).order_by('-sold')[:5]    # 对types数据进行筛选,获取字段等于"奶粉辅食"的所有数据    fl = [x.seconds for x in types if x.firsts == '奶粉辅食']    food = CommodityInfos.objects.filter(types__in=fl).order_by('-sold')[:5]    # 对types数据进行筛选,获取字段等于"儿童用品"的所有数据    gl = [x.seconds for x in types if x.firsts == '儿童用品']    goods = CommodityInfos.objects.filter(types__in=gl).order_by('-sold')[:5]    # render函数我们会单独进行详细讲解    return render(request, 'index.html', locals())# indexClassView类from django.views.generic.base import TemplateViewfrom commodity.models import *class indexClassView(TemplateView):    # 设置模板文件名    template_name = 'index.html'    # 设置解析模板文件的模板引擎,此处设置为None,    # 是默认使用配置文件settings.py的TEMPLATES的BACKEND所设置的模板引擎    template_engine = None    # 设置响应内容的数据格式    content_type = None    # 为模板文件设置额外变量    extra_context = {
'title': '首页', 'classContent': ''} # 重新定义模板上下文的获取方式 def get_context_data(self, **kwargs): context = super().get_context_data(**kwargs) context['commodityInfos'] = CommodityInfos.objects.order_by('-sold').all()[:8] types = Types.objects.all() # 儿童服饰 cl = [x.seconds for x in types if x.firsts == '儿童服饰'] context['clothes'] = CommodityInfos.objects.filter(types__in=cl).order_by('-sold')[:5] # 奶粉辅食 fl = [x.seconds for x in types if x.firsts == '奶粉辅食'] context['food'] = CommodityInfos.objects.filter(types__in=fl).order_by('-sold')[:5] # 儿童用品 gl = [x.seconds for x in types if x.firsts == '儿童用品'] context['goods'] = CommodityInfos.objects.filter(types__in=gl).order_by('-sold')[:5] return context # 定义HTTP的GET请求处理方法 # 参数request代表HTTP请求信息 # 若路由设有路由变量,则可从参数kwargs里获取 def get(self, request, *args, **kwargs): pass context = self.get_context_data(**kwargs) return self.render_to_response(context) # 定义HTTP的POST请求处理方法 # 参数request代表HTTP请求信息 # 若路由设有路由变量,则可从参数kwargs里获取 def post(self, request, *args, **kwargs): pass context = self.get_context_data(**kwargs) return self.render_to_response(context)

二、视图函数render详解

Django定义的render()函数是实现用户响应的过程,该函数的语法如下:

render(request, template_name, context=None, context_type=None, status=None, using=None)

render的参数request和template_name是必须参数,其余的参数是可选参数。各个参数的说明如下:

request:浏览器向服务器发送的请求对象,包含用户信息、请求内容和请求方式等。

template_name:设置模板文件名,用于生成网页内容。

context:对模板的上下文(模板变量)赋值,以字典格式表示,默认情况下是一个空字典。

context_type:响应内容的数据格式,一般情况下使用默认值即可。

status:HTTP状态码,默认是200。

using:设置模板引擎,用于解析模板文件,生成网页内容。

render读取模板文件的运行过程:

1、使用loader.render_to_string方法读取模板文件内容。

2、由于模板文件设有模板上下文,因此模板文件解析网页内容的过程需要由模板引擎using实现。

3、解析模板文件的过程中,loader.render_to_string的参数context给模板语法的变量提供具体的数据内容,若模板上下文在该参数里不存在,则对应的网页内容为空。

4、调用响应类HttpResponse,并将变量context(模板文件的解析结果)、变量content_type(响应内容的数据格式)和变量status(HTTP状态码)以参数形式传入HttpResponse,从而完成响应过程。

三、总结

看看我们本节所操作的文件在项目中的位置

在这里插入图片描述

转载地址:http://vwraf.baihongyu.com/

你可能感兴趣的文章
如何在excel每一行数据后面都加一个逗号
查看>>
java之架构基础-动态代理&cglib
查看>>
Java Guava中的函数式编程讲解
查看>>
Eclipse Memory Analyzer 使用技巧
查看>>
Java程序内存分析:使用mat工具分析内存占用
查看>>
使用 VisualVM 进行性能分析及调优
查看>>
删除vi编辑产生的.swp文件
查看>>
laypage同一页面加入多处分页实现
查看>>
数据库连接池C3P0最常用配置
查看>>
线上遇到插入重复数据(重复提交)
查看>>
tomcat连接超时
查看>>
Tomcat调优总结
查看>>
java CountDownLatch很简单的使用例子
查看>>
深入理解JDBC的超时设置
查看>>
Spring事务超时时间可能存在的错误认识
查看>>
eclipse 常用快捷键
查看>>
TreeSet去重字符串
查看>>
mysql5.7.10启动修改初始密码 Could not create or access the registry key needed
查看>>
Linux下查看MySQL的安装路径
查看>>
volatile与AtomicIntegerfieldupdater 区别与关系
查看>>