本文共 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)
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/