# 使用 Django 和 HTMX 簡化動態網頁開發 (第四篇): Payload 如何傳輸? 在使用傳統 JavaScript 的 `fetch` 進行 Ajax 請求時,發送 POST 請求通常會使用 `JSON.stringify()` 直接組裝 Payload。 大致的感覺如下: ```JavaScript fetch("/api/todos/", { method: "POST", headers: { "Content-Type": "application/json", "X-CSRFToken": csrftoken }, body: JSON.stringify({ title: "장보기", done: false, priority: 3 }) }) ``` 那麼 **HTMX** 是如何處理的呢?`hx-post` 究竟會以何種方式將資料發送到伺服器?由於許多範例只展示了非常簡單的功能,導致很難找到建立複雜 Payload 並發送的實際範例。 在這篇文章中,我們將完整整理 HTMX 的資料傳輸方式以及伺服器如何處理這些資料。  ------ ## HTMX 的資料傳輸方式 {#sec-1f930b1a0dad} **`fetch` 的 Payload 概念與 `hx-post` 的資料傳輸方式大相徑庭。** `fetch` 中,開發者直接建立物件並將其轉換為 JSON 放入 body。然而,**HTMX 基本上會從 DOM 中收集數值並進行傳輸**。 HTMX 的思維模式並非「直接組裝 JS 物件」,而是更接近於「**從 HTML 元素中收集數值以建立請求參數**」。為此,通常會採用以下三種方式: ### 1) 基於 Form 收集數值並發送 {#sec-f5086851ac19} 這是最符合 HTML 規範且與 Django 相容性最好的方式。 ```html
``` 在此情況下,HTMX 會收集表單中的輸入值並將其包含在請求中發送。預設的編碼方式與一般表單提交相同,採用 **URL-encoded form data** 格式。 Django 視圖可以像往常一樣接收: ```Python def create_todo(request): title = request.POST.get("title") priority = request.POST.get("priority") done = request.POST.get("done") ``` ### 2) 不使用 Form 但包含其他元素的值: `hx-include` {#sec-a2c0e1f9e1ca} 當您希望在一個按鈕上附加 `hx-post`,並同時選擇性地包含其他位置的輸入值時,可以使用此方法。 ```HTML ``` `hx-include` 會將指定元素的數值包含在請求中。即使沒有用 `