Django views.View视图

1、views.View与原生的区别:

  • 创建了as_view方法使得路由能够根据方法名识别请求类型。如:get请求不在url中传pk参数时,调用获取列表的方法,传入pk参数时,调用获取详情方法

2、视图中引入类

  • 由于获取列表与获取详情都是调用get方法,一个类中不能存在两个相同的方法名,所以根据参数pk是否传入分为两类:列表、详情
  • 列表中:获取列表、添加,方法分别为:get、post
  • 详情中:获取详情、更新、删除,方法分别为:get、put、delete

3、url的变动

  • 由于python3的path不支持参数匹配,所以使用re_path匹配路由
  • 列表路由:re_path('getlist/$', views.StudentListView.as_view())
    • 'getlist/$':路由匹配规则,访问url:.../getlist/
    • views.StudentListView.as_view():指定该路由的方法类的位置
  • 详情路由:re_path('getlist/$', views.StudentListView.as_view())
    • 'getlist/(?P<pk>\d+)/$':路由匹配规则,访问url:.../getlist/{id}/
    • views.StudentListView.as_view():指定该路由的方法类的位置

4、实践:

  • models:
from django.db import models


class StudentInfo(models.Model):
    name = models.CharField(max_length=200)
    age = models.IntegerField()
    sex = models.IntegerField()
    classes = models.CharField(max_length=200)

  • urls:
from django.urls import path, re_path
from . import views


urlpatterns = [
    re_path('getlist/$', views.StudentListView.as_view()),
    re_path('getlist/(?P<pk>\d+)/$', views.StudentDetailView.as_view()),
]

  • views:
import json

from django import views
from django.http import JsonResponse, HttpResponse

from drf.models import StudentInfo


class StudentListView(views.View):
    """列表视图,获取数据"""
    def get(self, request):
        # 指定查询集, 类型为:<QuerySet> 列表
        queryset = StudentInfo.objects.all()

        # 将查询出的数据转化为JSON数据并存入data列表,返回给前端
        data = []
        for stu in queryset:
            data.append({
                'id': stu.id,
                'name': stu.name,
                'age': stu.age,
                'sex': stu.sex,
                'classes': stu.classes
                })

        return JsonResponse(data, safe=False)

    def post(self, request):
        """列表视图,添加"""
        # 获取前端请求体中的数据,转为字典
        request_dict = json.loads(json.dumps(request.POST))

        """
        此处需要对请求参数request_dict进行判断,
        """

        # 将请求数据存入数据库
        # **request_dict: 将{'a': 'b'}转为 a=b
        student = StudentInfo.objects.create(**request_dict)

        # data为返回给前端的数据,类型: JSON
        data = {'id': student.id,
                'name': student.name,
                'age': student.age,
                'sex': student.sex,
                'classes': student.classes}

        return JsonResponse(data)

class StudentDetailView(views.View):
    """详情视图,获取详情"""
    def get(self, request, pk):
        # 判断前端传的id是否存在,否则返回404
        try:
            queryset = StudentInfo.objects.get(id=pk)
        except StudentInfo.DoesNotExist:
            return HttpResponse(status=404)

        # 将查询出的数据转为JSON传给前端
        data = {'id': queryset.id,
                'name': queryset.name,
                'age': queryset.age,
                'sex': queryset.sex,
                'classes': queryset.classes}

        return JsonResponse(data)

    def put(self, request, pk):
        # 判断前端传的id是否存在,否则返回404
        try:
            queryset = StudentInfo.objects.get(id=pk)
        except StudentInfo.DoesNotExist:
            return HttpResponse(status=404)

        # 获取前端请求体中的数据,转为字典
        request_dict = json.loads(json.dumps(request.GET))

        """
        此处需要对请求参数request_dict进行判断,得出哪些字段需要被更新
        """

        queryset.name = request_dict['name']
        queryset.save()

        # 将查询出的数据转为JSON传给前端
        data = {'id': queryset.id,
                'name': queryset.name,
                'age': queryset.age,
                'sex': queryset.sex,
                'classes': queryset.classes}

        return JsonResponse(data)

    def delete(self, request, pk):
        # 判断前端传的id是否存在,否则返回404
        try:
            queryset = StudentInfo.objects.get(id=pk)
        except StudentInfo.DoesNotExist:
            return  HttpResponse(status=404)

        # 删除
        queryset.delete()

        return HttpResponse(status=204)


5、结果:

  • 访问获取列表:

  • 访问详情

  • 访问添加

  • 访问更新

  • 访问删除

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值