天天看点

Django的View(视图)

Django的View(视图)

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

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

无论视图本身包含什么逻辑,都要返回响应。代码写在哪里也无所谓,只要它在你当前项目目录下面。除此之外没有更多的要求了——可以说“没有什么神奇的地方”。为了将代码放在某处,大家约定成俗将视图放置在项目(project)或应用程序(app)目录中的名为views.py的文件中。

下面是一个以HTML文档的形式返回当前日期和时间的视图:

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

首先,我们从 django.http模块导入了HttpResponse类,以及Python的datetime库。

接着,我们定义了current_datetime函数。它就是视图函数。每个视图函数都使用HttpRequest对象作为第一个参数,并且通常称之为request。

注意,视图函数的名称并不重要;不需要用一个统一的命名方式来命名,以便让Django识别它。我们将其命名为current_datetime,是因为这个名称能够比较准确地反映出它实现的功能。

这个视图会返回一个HttpResponse对象,其中包含生成的响应。每个视图函数都负责返回一个HttpResponse对象。

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

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

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

Django的View(视图)
Django的View(视图)

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

Django的View(视图)
Django的View(视图)

在url中引用他的时候要这样写

Django的View(视图)

使用CBV时要注意,请求过来后会先执行dispatch()这个方法,如果需要批量对具体的请求处理方法,如get,post等做一些操作的时候,这里我们可以手动改写dispatch方法,这个dispatch方法就和在FBV上加装饰器的效果一样。

官方文档

所有的属性应该被认为是只读的,除非另有说明。

request实际上就是HttpRequest类的实例化化对象    在实际使用的时候都是用     request.

Django的View(视图)
Django的View(视图)
Django的View(视图)
Django的View(视图)

request.POST中是没有上传的文件的相关信息的

request.body

request.files中是含有

Django的View(视图)
Django的View(视图)

注意:键值对的值是多个的时候,比如checkbox类型的input标签,select标签,需要用:

与由Django自动创建的HttpRequest对象相比,HttpResponse对象是我们的职责范围了。我们写的每个视图都需要实例化,填充和返回一个HttpResponse。

HttpResponse类位于django.http模块中。

传递字符串

设置或删除响应头信息

HttpResponse.content:响应内容

HttpResponse.charset:响应内容的编码

HttpResponse.status_code:响应的状态码

JsonResponse是HttpResponse的子类,专门用来生成JSON编码的响应。

默认只能传递字典类型,如果要传递非字典类型需要设置一下safe关键字参数。

render(request, template_name[, context])

结合一个给定的模板和一个给定的上下文字典,并返回一个渲染后的 HttpResponse 对象。

其默认的Content-Type标头设置为application/json。

上面的代码等于:

参数可以是:

一个模型:将调用模型的get_absolute_url() 函数

一个视图,可以带有参数:将使用urlresolvers.reverse 来反向解析名称

一个绝对的或相对的URL,将原封不动的作为重定向的位置。

默认返回一个临时的重定向;传递permanent=True 可以返回一个永久的重定向。

示例:

你可以用多种方式使用redirect() 函数。

传递一个对象(ORM相关)

将调用get_absolute_url() 方法来获取重定向的URL:

传递一个视图的名称

传递要重定向到的一个具体的网址

当然也可以是一个完整的网址

默认情况下,redirect() 返回一个临时重定向。以上所有的形式都接收一个permanent 参数;如果设置为True,将返回一个永久的重定向:

扩展阅读: 

临时重定向(响应状态码:302)和永久重定向(响应状态码:301)对普通用户来说是没什么区别的,它主要面向的是搜索引擎的机器人。

A页面临时重定向到B页面,那搜索引擎收录的就是A页面。

A页面永久重定向到B页面,那搜索引擎收录的就是B页面。

注意点  

对于新增或者编辑操作,跳转到一个页面的时候 ,如果表单填好提交之后最好用  redirect('/app01/student_list/')方法跳转回去  

不要用render (request,'student_list.html') 返回html 文件  因为他就会返回一个孤零零的页面没有信息  但是用 redirect  就会调用view中的函数  从而得到返回的数据

Django的View(视图)