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属性,并且会被传进来的这个属性值给覆盖掉
]

  

原文地址:https://www.cnblogs.com/kevin-red-heart/p/10447642.html