• Django之CBVFBV


    FBV(function base views) 就是在视图里使用函数处理请求。

    写一个FBV的实例:在views中代码 :就是写了个函数

     

    def book(request):
        '''
    
        :param request:
        :return:
        '''
        all_book = models.Book.objects.all()
        # <QuerySet [<Book: python>, <Book: 水浒传>]>
        ''' 
        要把数据库中的数据显示到前端页面,必然要通过html文件,而在视图view中可以通过models获取数据库的参数
    (这里指的是实例化对象(类-表;对象-行;对象.属性-字段),实例化对象时需要传参(关键字参数),这个参数要考虑从什么地方获得(get/post或其他方式能传过来)),
    同时通过view中的函数传参到html中.orm就是数据库中表与models中的类具有对应关系,可以读取数据 .objects相当于创建了一个控制器
    ''' # print('11111') # print(all_book) return render(request, 'book_lst.html', {'all_books': all_book})

    在urls中路由的写法:         url(r'^book_list/', views.book,name = 'book_list'),

                     views模块.book函数名

    CBV(class base views) 就是在视图里使用类处理请求。

    Python是一个面向对象的编程语言,如果只用函数来开发,有很多面向对象的优点就错失了(继承、封装、多态)。所以Django在后来加入了Class-Based-View。可以让我们用类写View。这样做的优点主要下面两种:

    1. 提高了代码的复用性,可以使用面向对象的技术,比如Mixin(多继承)
    2. 可以用不同的函数针对不同的HTTP方法处理,而不是通过很多if判断,提高代码可读性

    写一个CBV的实例:在views中代码

    from django.shortcuts import render, HttpResponse, reverse, redirect
    from app01 import models
    from django.views import View
    
    class MyView(View):
    
        def get(self,request):
            return  render(request,'am.html')
        def post(self,request):
            return HttpResponse('hello')

    注意在urls中路由的写法:

        注意:view.MyView.as_view()

          view模块.类名.as_view()  ###加''()''了

    from app01 import views #app01为自定义文件夹
    
    
    url(r'^my', views.MyView.as_view(),name = 'MyView'),

    CBV基本类视图中有get方法和post方法,如果返回的请求是get请求,直接执行类中的get方法,如果是post方法请求,直接执行view中的post方法...

    实例xxx

    class Myd(View):
        name = 'xx'
    
        def get(self,request,n):
            print('get方法执行了')
            print('>>>',n)
            return render(request,'cvpost.html',{'name':self.name})
    
        def post(self,request,n):
            print('post方法被执行了')
            return HttpResponse('post')

    传参:

      

    CBV传参,和FBV类似,有名分组,无名分组 见路由系统(url)

        url写法:无名分组的

     url(r'^cv/(d{2})/', views.Myd.as_view(),name='cv'), #无名
     url(r'^cv/(?P<n>d{2})/', views.Myd.as_view(name='xxx'),name='cv'),#有名分组
    #如果想给类的name属性赋值,
    前提你的Myd类里面必须有name属性(类属性,定义init方法来接受属性行不通,但是可以自行研究一下,看看如何行通,意义不大),并且之前类里面的name属性的值会被覆盖掉

    在传给类方法时也是在request后加上形参,来接受参数

    class MyView(View):
    
        def get(self,request,n):
            return  render(request,'am.html')
        def post(self,request,n):
            return HttpResponse('hello')

    添加类的属性可以通过两种方法设置,第一种是常见的Python的方法,可以被子类覆盖。

    复制代码
    from django.http import HttpResponse
    from django.views import View
      
    class GreetingView(View):
        name = "yuan"
        def get(self, request):
             return HttpResponse(self.name)
      
    # You can override that in a subclass
      
    class MorningGreetingView(GreetingView):
        name= "alex"
    复制代码

        第二种方法,你也可以在url中指定类的属性:

        在url中设置类的属性Python

    urlpatterns = [
       url(r'^index/$', GreetingView.as_view(name="egon")), #类里面必须有name属性,并且会被传进来的这个属性值给覆盖掉
    ]

      

  • 相关阅读:
    [算法专题] 深度优先搜索&回溯剪枝
    [算法专题] 二分搜索&排序数组
    rand_1tom 产生 rand_1ton
    [LeetCode] Kth Largest Element in an Array
    进程控制(Note for apue and csapp)
    Transport Layer Protocols
    Internetworking
    Dynamic Programming | Set 4 (Longest Common Subsequence)
    Dynamic Programming | Set 3 (Longest Increasing Subsequence)
    Dynamic Programming | Set 2 (Optimal Substructure Property)
  • 原文地址:https://www.cnblogs.com/kevin-red-heart/p/10447642.html
Copyright © 2020-2023  润新知