開始使用檢視

已完成

在程式設計中,「檢視」通常是向使用者顯示資訊的元件。 檢視所執行的工作會視架構和慣例而有所不同,包括載入資料的責任。

在 Django 中,檢視通常負責:

  • 驗證使用者的要求。
  • 載入或修改適當的資料。
  • 將包含資訊的 HTML 範本傳回給使用者。

我們即將討論如何手動建立檢視,以及設定適當的 URLconfs,以開始進行探索。 URLconf 是路徑清單,表示要比對的模式、要呼叫的函式以及名稱 (選擇性)。 在稍後的單元中,我們將了解 Django 如何自動處理我們以手動方式撰寫的一些程式碼。

建立檢視表

若要在 Django 中從頭開始建立檢視,您通常會建立函式。 函式通常包含適當的程式碼,可:

  • 執行使用者已要求的工作。
  • 傳回範本,其中包含要向使用者顯示的適當資料。

view 函式一律會採用至少一個名為 request 的參數,其代表使用者的要求。 如果您希望 URL 中的使用者有更多資訊 (例如項目的名稱或識別碼),您可以視需要提供更多參數。 您將在建立路由時加以註冊,我們稍後會本此單元中進行討論。

載入資料

您可以使用 Django ORM 從註冊的資料庫載入所需的任何資料。

我們所建立的專案有兩個模型:ShelterDog。 我們可以載入所有物件,或使用我們建立的模型來執行其他查詢。 例如,若要載入所有收容中心,我們會使用 Shelter.objects.all()。 我們可以使用 Shelter.objects.get(pk=1) 載入個別的收容中心。

注意

pk 是主索引鍵的捷徑。 您可以使用 id 來獲得相同的結果,但如果您已將代表主索引鍵的屬性變更為不同的名稱,則使用 pk 將確保命令可正常運作。

404 錯誤

Web 應用程式中的 404 錯誤表示「找不到」。最佳做法是,每當對不存在的物件提出要求時,您應該傳回 404。

Django 提供嘗試載入資料的捷徑:

  • get_object_or_404get_list_or_404:依主索引鍵載入物件,如果找不到物件,則會將 404 傳回給使用者。
  • get_list_or_404:執行與其他捷徑相同的作業,但其會接受篩選參數。

我們將在練習中使用 get_object_or_404

轉譯範本

Django 的範本化引擎會採用我們所建立的 HTML 範本、將其與我們提供的任何資料結合,然後發出瀏覽器的 HTML。 執行這項工作的協助程式函式為 render

render 函式需要代表要求的物件,也就是我們先前強調的 request 參數。 您也會傳入範本的名稱,通常是將位於名為 [範本] 資料夾中的 HTML 檔案。

若要將資料傳入範本,請使用 context 字典物件提供 rendercontext 物件包含一組索引鍵/值組,其中每個索引鍵都會變成範本中的變數。

範例

若要建立顯示所有收容中心的檢視,您可以使用下列程式碼:

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 函式一樣。