原文链接:https://www.cnblogs.com/maple-shaw/articles/9285269.html

一个视图函数(类),简称视图,是一个简单的Python 函数(类),它接受Web请求并且返回Web响应。

响应可以是一张网页的HTML内容,一个重定向,一个404错误,一个XML文档,或者一张图片。

views.py的文件中。


一个简单的视图

下面是一个以HTML文档的形式返回当前日期和时间的视图:
Django的View(视图)
from django.http import HttpResponse
import datetime

def current_datetime(request):
    now = datetime.datetime.now()
    html = "<html><body>It is now %s.</body></html>" % now
    return HttpResponse(html)
Django的View(视图)

让我们来逐行解释下上面的代码:

  • datetime库。

  • request

    current_datetime,是因为这个名称能够比较准确地反映出它实现的功能。

  • HttpResponse对象。

Django使用请求和响应对象来通过系统传递状态。

当浏览器向服务端请求一个页面时,Django创建一个HttpRequest对象,该对象包含关于请求的元数据。然后,Django加载相应的视图,将这个HttpRequest对象作为第一个参数传递给视图函数。

每个视图负责返回一个HttpResponse对象。


CBV和FBV

CBV  :class based views       FBV :function based views

我们之前写过的都是基于函数的view,就叫FBV。还可以把view写成基于类的。

就拿我们之前写过的添加班级为例:

FBV版:

Django的View(视图)
# FBV版添加班级
def add_class(request):
    if request.method == "POST":
        class_name = request.POST.get("class_name")
        models.Classes.objects.create(name=class_name)
        return redirect("/class_list/")
    return render(request, "add_class.html")
Django的View(视图)

CBV版:

Django的View(视图)
# CBV版添加班级
from django.views import View


class AddClass(View):

    def get(self, request):
        return render(request, "add_class.html")

    def post(self, request):
        class_name = request.POST.get("class_name")
        models.Classes.objects.create(name=class_name)
        return redirect("/class_list/")
Django的View(视图)

注意:

使用CBV时,urls.py中也做对应的修改:

# urls.py中
url(r'^add_class/$', views.AddClass.as_view()),

将函数改为类(FBV->CBV)案例,即定义CBV的写法:

新增出版社函数分get请求和post请求,各自返回不同的内容,逻辑代码如下

# 新增出版社
def add_publisher(request):
    error = ''
    # 对请求方式进行判断
    if request.method == 'POST':
        # 处理POST请求
        # 获取到出版社的名称
        publisher_name = request.POST.get('publisher_name')
        # 判断出版社名称是否有重复的
        if models.Publisher.objects.filter(name=publisher_name):
            error = '出版社名称已存在'
        # 判断输入的值是否为空
        if not publisher_name:
            error = '不能输入为空'
        if not error:
            # 使用ORM将数据插入到数据库中
            obj = models.Publisher.objects.create(name=publisher_name)
            # 跳转到展示出版社的页面
            return redirect('/publisher_list/')
    # 返回一个包含form表单的页面
    return render(request, 'add_publisher.html', {'error': error})
新增出版社函数

1)我们要将函数改成类,这个类不能直接只是我们自己写,因为需要很多功能,自己写的然后需要继承Django的View类。
2)定义的类中写get和post等方法,需要接收参数request。方法中是各自请求做的操作以及返回的一个响应
3)当请求到来时根据请求方法会执行对应的方法,然后返回响应的内容

4)这样执行的好处是把各个请求的代码分开了,是逻辑更清楚

5)如果还有其他的请求,那么继续写对应请求的方法。

Django的View(视图)

6)使用CBV:将之前对应的函数写成对应的类,并且模块.类.as_views() 执行,这样就实现了CBV写法,get请求就走get方法

Django的View(视图)

如果没有加as_views(),那么报错:

Django的View(视图)

没有执行报错:

Django的View(视图)

如此才是正确的

url(r'^add_publisher/', views.AddPblisher.as_view()),

相关文章:

  • 2022-12-23
  • 2021-06-26
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2021-07-17
猜你喜欢
相关资源
相似解决方案