原文链接:https://www.cnblogs.com/maple-shaw/articles/9285269.html
一个视图函数(类),简称视图,是一个简单的Python 函数(类),它接受Web请求并且返回Web响应。
响应可以是一张网页的HTML内容,一个重定向,一个404错误,一个XML文档,或者一张图片。
views.py的文件中。
一个简单的视图
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)
让我们来逐行解释下上面的代码:
-
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版:
# 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")
CBV版:
# 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/")
注意:
使用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)如果还有其他的请求,那么继续写对应请求的方法。
6)使用CBV:将之前对应的函数写成对应的类,并且模块.类.as_views() 执行,这样就实现了CBV写法,get请求就走get方法
如果没有加as_views(),那么报错:
没有执行报错:
如此才是正确的
url(r'^add_publisher/', views.AddPblisher.as_view()),