# 使用Django和HTMX简化动态Web开发(第四部分):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`究竟是以何种方式向服务器发送数据的?由于许多示例只展示了非常简单的功能,要找到创建和发送复杂数据负载的实际案例却出乎意料地困难。 本文将彻底梳理HTMX中的数据传输方式以及服务器如何处理这些数据。  ------ ## HTMX的数据传输方式 {#sec-1f930b1a0dad} `fetch`的数据负载处理方式与`hx-post`的数据传输方式存在显著差异。 在`fetch`中,开发者需要手动创建对象并将其转换为JSON格式放入请求体(body)。而**HTMX则默认收集DOM中的值并进行传输**。 HTMX的思维方式更接近于**“从HTML元素中收集值来构建请求参数”**,而非“直接组装JS对象”。通常,它采用以下三种方式: ### 1) 基于表单收集并发送值 {#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) 不使用表单,包含其他元素的值:`hx-include` {#sec-a2c0e1f9e1ca} 当您希望在一个按钮上使用`hx-post`,并同时选择性地发送一些分散的输入值时,可以使用此方式。 ```HTML ``` `hx-include`会将指定元素的值包含在请求中。它无需将所有输入项都包裹在`