首页 > 技术文章 > django的视图

niuyeji648 2021-07-06 00:02 原文

类视图

Class Base View,简称"CBV",与我们之前编写的视图函数不同, 类视图是类的结构编写视图代码的.可以让我们实现相关业务代码的整合. 同时还在函数视图的基础上, 可以实现 对于客户端访问的http请求进行分流和限制。

类视图的基本定义

from django.shortcuts import render
from django.views import View
"""
1. 类视图的声明必须直接或者间接继承于django.views.View
2. 类视图中的视图方法名称是固定的.必须以http请求的小写方法名作为视图方法名!!!【get,post,put,patch,delete】
3. 每一个视图类都可以绑定一个路由, 而视图类中的所有视图方法共享这个路由地址
4. 类方法的名称虽然固定, 但是类视图并非每个方法都要添加.注意,同一个视图类下,类方法名不能重复.
"""
class IndexView(View):
    """类视图"""
    def get(self,request):
        """只允许通过get请求访问,建议编写读取数据的页面,一般例如:首页,列表页,详情页"""
        name = "get请求页面"
        return render(request,"index5.html",locals())

    def post(self,request):
        """只允许通过post请求访问,一般用于上传,添加数据的页面"""
        name = "post请求页面"
        return render(request,"index5.html",locals())

    def put(self,request):
        """只允许通过put请求访问,一般用于修改,更新数据的页面"""
        name = "put请求页面"
        return render(request,"index5.html",locals())

    def patch(self,request):
        """只允许通过patch请求访问,一般用于修改,更新数据的页面"""
        name = "patch请求页面"
        return render(request,"index5.html",locals())

    def delete(self,request):
        """只允许通过delete请求访问,一般用于处理删除数据的页面"""
        name = "delete请求页面"
        return render(request,"index5.html",locals())

类视图的路由绑定

from django.urls import path
from . import views
urlpatterns = [
    # 给类视图绑定路由的格式固定如下:
    # path("访问路径", views.类名.as_view()),
    path("demo", views.IndexView.as_view()),
]

类视图的路由分发原理

我们可以通过postman来切换不同的http请求访问到同一个地址下不同的视图类方法中.这个主要原因是类视图的父类django.views.View中提供了dispatch的路由分发方法实现的.

这个路由分发方法,是开发者在给视图类绑定路由时调用了as_views()方法时进行注册调用的.

 

 

视图基类的基本使用

from django.shortcuts import render
from django.views import View
# Create your views here.

from django.http.response import JsonResponse
class BaseView(View):
    """公共视图基类"""

    # 可以把没有参数的类方法,转换成普通属性来调用
    @property
    def json(self):
        """用于接受并装换json数据成字典"""
        import json
        data = json.loads(self.request.body)
        return data

class UserView(BaseView):
    def get(self, request):
        user_info = {
            "id": 10,
            "name": "xiaoming",
            "age": 17
        }

        return JsonResponse(user_info)

    def post(self,request):
        # 接受数据
        # print( request.body )
        # 可以继承公共视图类,使用自己封装json方法获取请求体的json数据
        data = self.json
        print(data)
        name = "post请求页面"
        return JsonResponse({"errmsg":"ok","errno":200,"data":{"name":name}})


    def put(self, request):
        """只允许通过put请求访问,一般用于修改,更新数据的页面"""
        name = "put请求页面"
        return JsonResponse({"errmsg":"ok","errno":200,"data":{"name":name}})


    def patch(self, request):
        """只允许通过patch请求访问,一般用于修改,更新数据的页面"""
        name = "patch请求页面"
        return JsonResponse({"errmsg":"ok","errno":200,"data":{"name":name}})

    def delete(self, request):
        """只允许通过delete请求访问,一般用于处理删除数据的页面"""
        name = "delete请求页面"
        return JsonResponse({"errmsg": "ok", "errno": 200,"data":{"name":name}})

 

在django提供的视图类View使用中,还提供了一些视图子类,
不过这块内容需要结合django的数据库操作才可以使用
视图子类是django为了方便开发者快速提供基于不同http请求视图而提供的。

from django.views.generic import ListView,DetailView,CreateView,UpdateView,DeleteView

ListView:   列表视图,可以通过get请求访问,用于展示列表数据,内置了分页功能    
DetailView:详情视图,可以通过get请求访问,用于展示单个数据
CreateView:添加视图,可以通过get/post请求访问,用于添加单个数据
UpdateView:更新视图,可以通过get/post请求访问,用于更新单个数据
DeleteView:删除视图,可以通过get请求访问,用于删除单个数据

  

推荐阅读