## 輕鬆實現與伺服器間的強大非同步通訊 {#sec-b77e387924b4}
[[HTMX]] 讓您在 Django 這類以伺服器為中心的網頁開發框架中,無需複雜的 [[JavaScript]] 即可實現強大的非同步功能。在本篇中,我們將透過具體範例,深入探討 **HTMX 處理 Ajax 請求的內部原理**以及**與 Django 視圖實際溝通的方式**。

## [[HTMX]] 的核心:HTML 即訊息 {#sec-fcb60a4b40b4}
傳統的 Ajax 通訊(例如:axios, fetch)通常從伺服器接收 JSON 資料,然後由 JavaScript 解析並重新繪製畫面。然而,HTMX 遵循 **「超媒體即應用程式狀態引擎 (Hypermedia as the Engine of Application State, HATEOAS)」** 原則。這意味著伺服器傳送的不是資料 (JSON),而是**已完成的 HTML 片段**,HTMX 僅需將其「替換」到指定位置。
**HTMX 的 Ajax 通訊四階段**
1. **事件觸發:** 使用者與 HTML 元素(如按鈕)互動。
2. **Ajax 請求:** HTMX 呼叫瀏覽器的 `fetch` API 向伺服器發送請求。
3. **HTML 回應:** 伺服器處理邏輯後,返回的不是整個頁面,而是**所需部分的 HTML 片段**。
4. **DOM 替換 (Swap):** HTMX 立即將接收到的 HTML 插入到 `hx-target` 指定的元素中。
## 實戰範例:「讚」按鈕的實作 {#sec-5eb5b07b3b51}
除了單純改變數字外,我們將探討伺服器與客戶端如何交換 HTML 片段。
### 1. 前端 (Template) {#sec-cad7db10ba2b}
此方法透過 `hx-post` 發送請求,並以伺服器回傳的內容替換整個 `#like-section`。
```html
```
如本範例所示,當 `hx-target` 和 `hx-swap` 明確寫在 HTML 標籤中時,日後重新閱讀程式碼,便能立即了解「點擊此按鈕後,哪個部分會如何變化」,而無需翻查 JavaScript 檔案。個人感覺,雖然查看後端 View 函數可能會有點不便,但如上述範例,將 `hx-` 程式碼嵌入 HTML 標籤中,在 **Locality of Behavior** 方面,或許比內聯 JavaScript 更好。
### 2. 後端 (Django View) {#sec-1fda4c57da3b}
這裡的重點是**使用 `render` 而非 `JsonResponse`**。
```python
from django.shortcuts import render
def like_post(request):
# 處理按讚邏輯 (例如:資料庫更新)
new_count = 10
# 返回的不是整個頁面,而是僅包含按鈕部分的輕量模板片段。
return render(request, 'partials/_like_button.html', {
'likes_count': new_count
})
```
## 3. 回應用部分模板 {#sec-ce5390bdc052}
這是伺服器將傳送給客戶端的「HTML 片段」。由於設定了 `hx-swap="outerHTML"`,此內容將替換掉現有的整個 `#like-section`。
```HTML
```
### 為何如此設計?(原理理解) {#sec-67af112c65f1}
傳統方式中,接收到 `JsonResponse({'likes': 10})` 後,需要在 JavaScript 中編寫類似 `document.getElementById('count').innerText = data.likes` 的程式碼。
然而,[[HTMX]] 方式具備以下優點:
1. **避免邏輯碎片化:** 「點讚後畫面應如何變化」的定義由伺服器 (Django 模板) 管理。
2. **資料-視圖同步:** 由於伺服器傳送的 HTML 直接呈現在畫面上,因此消除了客戶端在處理資料時可能發生的錯誤。
## 本篇總結 {#sec-b28d1b5245c5}
使用 [[HTMX]] 不僅是為了減少程式碼,更是回歸到充分利用網頁本質功能「超媒體 (HTML)」的方式。如此一來,開發者便能擺脫 JavaScript 狀態管理的困擾,更專注於伺服器端邏輯。
**相關文章閱讀** :
- [透過 Django 與 HTMX 簡化動態網頁開發 (第一篇)](/ko/whitedec/2025/1/27/django-htmx-dynamic-web-simplification/)
- [透過 Django 與 HTMX 簡化動態網頁開發 (第三篇)](/ko/whitedec/2025/1/27/django-htmx-dynamic-web-simplification-3/)
- [透過 Django 與 HTMX 簡化動態網頁開發 (第四篇): CSRF 令牌整合](/ko/whitedec/2025/1/27/django-htmx-csrf-token-integration/)
- [透過 Django 與 HTMX 簡化動態網頁開發 (第五篇): 進階功能](/ko/whitedec/2025/1/27/django-htmx-advanced-features/)
- [透過 Django 與 HTMX 簡化動態網頁開發 (第六篇): HTML 回傳方式](/ko/whitedec/2025/1/27/django-htmx-html-response/)
- [透過 Django 與 HTMX 簡化動態網頁開發 (第七篇): JSON 回傳方式](/ko/whitedec/2025/1/27/django-htmx-json-response/)