開始使用檢視
在程式設計中,「檢視」通常是向使用者顯示資訊的元件。 檢視所執行的工作會視架構和慣例而有所不同,包括載入資料的責任。
在 Django 中,檢視通常負責:
- 驗證使用者的要求。
- 載入或修改適當的資料。
- 將包含資訊的 HTML 範本傳回給使用者。
我們即將討論如何手動建立檢視,以及設定適當的 URLconfs,以開始進行探索。 URLconf 是路徑清單,表示要比對的模式、要呼叫的函式以及名稱 (選擇性)。 在稍後的單元中,我們將了解 Django 如何自動處理我們以手動方式撰寫的一些程式碼。
建立檢視表
若要在 Django 中從頭開始建立檢視,您通常會建立函式。 函式通常包含適當的程式碼,可:
- 執行使用者已要求的工作。
- 傳回範本,其中包含要向使用者顯示的適當資料。
view 函式一律會採用至少一個名為 request
的參數,其代表使用者的要求。 如果您希望 URL 中的使用者有更多資訊 (例如項目的名稱或識別碼),您可以視需要提供更多參數。 您將在建立路由時加以註冊,我們稍後會本此單元中進行討論。
載入資料
您可以使用 Django ORM 從註冊的資料庫載入所需的任何資料。
我們所建立的專案有兩個模型:Shelter
和 Dog
。 我們可以載入所有物件,或使用我們建立的模型來執行其他查詢。 例如,若要載入所有收容中心,我們會使用 Shelter.objects.all()
。 我們可以使用 Shelter.objects.get(pk=1)
載入個別的收容中心。
注意
pk
是主索引鍵的捷徑。 您可以使用 id
來獲得相同的結果,但如果您已將代表主索引鍵的屬性變更為不同的名稱,則使用 pk
將確保命令可正常運作。
404 錯誤
Web 應用程式中的 404 錯誤表示「找不到」。最佳做法是,每當對不存在的物件提出要求時,您應該傳回 404。
Django 提供嘗試載入資料的捷徑:
get_object_or_404
和get_list_or_404
:依主索引鍵載入物件,如果找不到物件,則會將 404 傳回給使用者。get_list_or_404
:執行與其他捷徑相同的作業,但其會接受篩選參數。
我們將在練習中使用 get_object_or_404
。
轉譯範本
Django 的範本化引擎會採用我們所建立的 HTML 範本、將其與我們提供的任何資料結合,然後發出瀏覽器的 HTML。 執行這項工作的協助程式函式為 render
。
render
函式需要代表要求的物件,也就是我們先前強調的 request
參數。 您也會傳入範本的名稱,通常是將位於名為 [範本] 資料夾中的 HTML 檔案。
若要將資料傳入範本,請使用 context
字典物件提供 render
。 context
物件包含一組索引鍵/值組,其中每個索引鍵都會變成範本中的變數。
範例
若要建立顯示所有收容中心的檢視,您可以使用下列程式碼:
def shelter_list(request):
shelters = Shelter.objects.all()
context = { 'shelters': shelters }
return render(request, 'shelter_list.html', context)
註冊路徑
幾乎任何 Web 架構都會使用路徑來處理使用者要求。 路徑會將網域名稱之後以及查詢字串 (在問號之後) 之前的 URL 部分轉換為函式呼叫。
呼叫 www.contoso.com/shelters
可能會呼叫函式以列出所有收容中心,而呼叫 www.contoso.com/shelters/1
可能會呼叫函式來顯示識別碼為 1 的收容中心。 您可以建立 URLconf 以在 Django 中註冊路徑。
假設我們有一個稱為 views
的模組,也就是 Django 慣例。 我們可以將未指定路徑的索引流量 (例如 www.contoso.com
) 路由傳送至 views
中稱為 index
的函式,並使用下列路徑為其命名,稱為 index
:
path('', views.index, 'index')
我們也可以建立特定要求的虛擬資料夾。 例如,如果我們要在有人要求 /shelters 時列出所有收容中心,可以使用下列命令:
path('shelters', views.shelter_list, 'shelter_list')
URL 參數
常見做法是將參數傳遞至應用程式做為 URL 的一部分,例如識別碼或名稱。 因為這些值將會變更,所以我們不需要將其進行硬式編碼到我們的路徑中。 在 Django 中,您可以使用特殊語法來指定參數。 在該語法中,您可以指出您所預期的資料類型,例如整數和名稱。
例如,若要建立路徑,讓某人依識別碼要求特定的收容中心,我們需要 integer
類型的參數。 (原因是我們的主索引鍵是整數。) 接著,我們可以提供要用於變數的名稱,然後將其當作參數傳遞給 view 函式。 用來識別此參數的語法為 <int:pk>
。 請注意類型宣告、冒號,以及變數的名稱。
完整路徑看起來可能像這樣:
path('shelter/<int:pk>', views.shelter_detail, name='shelter_detail')
相關聯的 view 函式會有下列簽章:
def shelter_detail(request, pk):
# code
路徑簽章的 pk
部分會以參數的形式傳入 shelter_detail
,就像我們呼叫一般 Python 函式一樣。