天天看點

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(視圖)