常见的类视图

1.  generic.View  视图类

重写get,post,put,delete,可以实现不同的请求方法的逻辑,

可以快速实现restful风格的接口开发

class IndexView(generic.View):
    def get(self, *args, **kwargs):
        pass

    def post(self, *args, **kwargs):
        pass

    def put(self, *args, **kwargs):
        pass

    def delete(self, *args, **kwargs):
        pass

 from django.views import View

 views文件中:

url.py 定义路由

另外:url.py 中,要这么写

后面加一个as_view()

path('rest/',views.ProjectsView.as_view())
————————————————

注:

        这个是一个相同的路由,用一个视图类。

使用 View 类  de 项目举例:

        因为有两个相同的路由,所以建了两个 视图类。

下面是不完成的代码,只是表达意思,具体的代码见

https://mp.csdn.net/mp_blog/creation/editor/130734106

视图中就写了两个类视图来实现

class CountryView(View):
    # 获取所有的数据
    def get(self, request):
        # 方式1: 直接用数据库中的,字段名作为字段返回
        county_querySetList=Country.objects.values("id","name")
        county_list=list(county_querySetList)

        # 方式2: 列表生成式,重写生成一个列表,可以新命名
        county_list2 = [{"id":item.id,"country_name": item.name} for item in Country.objects.all()]

        return  JsonResponse(county_list2,safe=False)     # safe 设置为False,可以转码

    # 创建一条数据
    def post(self, request):
        # 0.用try处理 非 json字符串的情况
        try:
            body = json.loads(request.body)     # 把json字符串 转成  字典(python中的数据类型)
            c1=Country.objects.create(name=body["name"])
            return JsonResponse({'id':c1.id,'msg':'创建成功'})
        except Exception as e:
            return JsonResponse({'msg':'参数有误'},status=400)

class CountryView2(View):
    # 获取一条国家数据
    def get(self,request,pk):
        try:    # 1.可以用try,处理   校验传递的pk 在数据库不存在的情况  等
            c1 = Country.objects.get(id=pk)
        except Exception as e:
            return JsonResponse({'msg':'参数有误'},status=400)
        return JsonResponse({'suscuce':True,"data":{"id":c1.id,"name":c1.name}})

    # 修改一条数据
    def put(self,request,pk):
        try:  # 1.可以用try,处理   校验传递的pk 在数据库不存在的情况  等
            c1 = Country.objects.get(id=pk)
            body = json.loads(request.body)
            c1.name=body.get("newName")
            c1.save()
        except Exception as e:
            return JsonResponse({'msg': '参数有误'}, status=400)
        return JsonResponse({'suscuce': True, "data": {"id": c1.id, "name": c1.name},'msg':'更新成功'})

    # 删除一条数据
    def delete(self,request,pk):        # 注意: 这个练习,要删除以一个没有学生的国家,因为设置时时保护型的。
        try:  # 1.可以用try,处理   校验传递的pk 在数据库不存在的情况  等
            c1 = Country.objects.get(id=pk)
            c1.delete()
        except Exception as e:
            return JsonResponse({'msg': '参数有误???'}, status=400)

        return JsonResponse({'suscuce': True,'msg':'删除成功'},status=204)
    1. 查询所有数据,没有分页,没有过滤
    2. 请求参数未做校验,如果要校验会很麻烦,需要很多if 条件
    3. 没有认证授权功能
    4. 没有限流功能
    5. 5个接口无法放在同一个类视图中

为了解决这个问题,就要知道 django  restframework

----------------------以下这个不常用- 前后端不分离用的(先不用管)-------------------------------:-

 类视图相比函数视图,可以更快速的按模板来开发。

路由配置时,视图类后面要加上  as_view()  # 

1. generic.TemplateView功能渲染html文件,并传一些数据给页面。

源码:

一种方式是重写源码中的get_context_data 方法


from django.views import generic
class IndexView(generic.TemplateView):
    template_name = "polls/index.html"

    def get_context_data(self, **kwargs):
        latest_question_list = Question.objects.order_by('-pub_date')[:5]
        context = {
            'latest_question_list': latest_question_list,
        }
        return context

另一种重写源码中的get方法

from django.views.generic import TemplateView
class IndexView(TemplateView):
    template_name = "index.html"

    def get(self, request, *args, **kwargs):
        article_list = Article.objects.order_by("-create_time")     # 文章要按时间来降序
    
        context = {
            "article_list": article_list,

        }
        return self.render_to_response(context)

只要按照这个格式写,就能实现功能 

这个视图类和 如下 功能相同

  • return render(request, 'polls/results.html', {'question': question})

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值