视图是Django的MTV架构模式的V部分,主要负责处理用户请求和成相应的响应内容,然后在页面或其他类型文档中显示。主要处理功能和业务上的逻辑。
Response响应类型
HttpRResponse('hello world'): HTTP状态码200,请求成功
HttpResponseRedirect('/admin'):HTTP状态码302,重定向admin站点的URL
HttpResponsePermanenrRedirect('/admin'): 永久重定向
HttpResponseBadRequest('Nothing'): HTTP状态码400,访问的页面不存在或者请求错误
HttpRespnseForbidden('NotFound'): HTTP状态码403,没有访问权限
HttpResponseNotAllowed('NotAllowedGet'): HTTP状态码405,不允许使用该请求方式
HttpResponseServerError('ServerError'): HTTP状态码500,服务器错误
上述是一些常用的响应方式,实际开发过程中,使用最多的是render()、redirect(),其实是对HttpResponse函数进行封装,render具体解释说明如下:
request: 请求对象,包含用户请求的相关信息
template_name: HTML模板文件名,用于生成HTML网页
context: 对HTML模板的变量赋值,以字典格式表示,默认情况下是一个空字典
content_tyep: 响应数据的格式,一般情况下使用默认值
status: HTTP状态码,默认200
using: 设置HTML模板转换生成HTML网页的模板引擎
数据视图
视图除了接收用户请求和返回响应内容之外,还可以与模型Model实现数据交互。视图相当于一个处理中心,负责接收用户请求,根据请求信息读取并处理数据库,最后返回生成HTML网页给用户。
数据视图实质是从models.py导入数据库映射对象,是通过Django内置的ORM框架构建数据库映射,从而生成数据库对象。下面的代码就是将Prduct模型类与数据库表Product构成映射关系:
from django.db import models
# Create your models here.
class Product(models.Model):
id = models.IntegerField(primary_key=True)
name = models.CharField(max_length=50)
type = models.CharField(max_length=20)
数据库库表的迁移和建立这里就不做描述了,后续文章有详细讲解。
视图函数index的处理流程讲解:
1.type_list用于查询数据表字段type的数据并去重处理,name_list查询数据表字段type和name的数据,查询方式都是由Django内置的ORM提供
2.将查询所得的数据以字典的数据格式写入变量context,其作用是将该数据返回给HTML模板
3.当HTML模板接受到变量type_list、name_list后,模板引擎解析并生成对应的HTML文件内容
locals()使用注意:变量context是以字典的形式传参给HTML模板,实际开发过程中,如果传递的变量过多,不易维护和更新,因此使用locals()代替context。在视图函数中所定义的变量名一定要与HTML模板的变量名相同才能生效。
Request的常用属性
COOKIES: 获取客户端浏览器Cookies信息.实例: data = request.COOKIES
FILES: 字段对象,包含所有的上载文件,三个键:filename文件名、content-type为类型、content为内容。 实例: file = request.FILES
GET: 获取get请求的请求参数,字典形式储存。实例: request.GET.get('name')
META:获取客户端的请求头信息,字典形式储存。实例: request.META.get('REMOTO_ADDR')
POST: 获取post请求的参数,字典形式储存。实例: request.POST.get('name')
method: 获取该请求的请求方式,实例: data = request.method
path: 获取当前请求的URL地址。实例:path = request.path
user: 获取当前请求的用户信息,实例: name = request.user.username
通用视图
web开发是一项无聊而且单挑的工作,特别是在视图编码功能方面,为了减少工作量,Django植入了通用视图功能,封装了视图开发常用的代码和模式,可以在无需编码大量代码的情况下,快速完成数据视图的开发 。通用视图是通过定义和声明类的形式实现的,主要分为三类,具体说明如下:
TemplateView:直接返回HTML模板,但无法将数据库的数据库展示出来
ListView:能将数据库的数据传递给HTML模板,通常获取某个表的all data.
DetailView:能将数据库的数据传递给HTML模板,通常获取某个表的单条数据.
如果URL所指向的处理程序是由通用视图执行的,那么在编码URL时,必须使用as_view()方法,业务通用视图实质是一个类,使用该方式相当于对类进行实例化并由类方法执行处理。views.py文件下编写通用视图,代码如下:
代码解释说明:
1.定义ProductList类,该类继承ListView类,具有父类所有特性。
2.context_object_name:设置HTML模板的变量
3.template_name:设置HTML模板
4.queryset:查询数据库数据,查询结果会赋值给context_object_name所设置的变量
5.重写函数get_queryset:该函数的功能与queryset实现的功能一致
6.重写函数get_context_data:该函数设置HTML模板的其他变量
通用视图的代码编写规则有一定的固定格式,根据这个固定格式可以快速开发数据视图,除此之外,通用视图还可以获取url的参数和请求信息,是的通用视图更加灵活,以get_queryset函数为例:
def get_queryset(self):
print(self.kwargs['id'])
print(self.kwargs['name'])
print(self.request.method)
type_list = Product.objects.values('type').distinct()
return type_list
上述代码演示了如何在通用视图中获取url的参数变量和用户的请求信息,代码具体说明如下:
1.首先对url设置变量id和参数name,这两种设置方式都是日常开发中经常使用的
2.通用视图在处理用户请求时,url的变量和参数都会存放在通用视图的属性开kwargs中,因此使用self.kwargs['XXX']可以获取变量值或参数值
3.要获取用户请求信息,可以从属性self.request中获取.
网友评论