You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在Django中使用HTMX发送多值请求时仅收到value的问题

解决HTMX向Django后端同时发送field和value的问题

方法1:修正hx-vals的引号与模板渲染问题

你当前使用"转义引号可能导致HTMX无法正确解析JSON结构。可以改用单引号包裹hx-vals内容,内部用双引号,避免Django模板的转义冲突:

<input type="text" name="value" value="{{ value }}" 
    class="editable-field bg-gray-50 border border-gray-300 text-gray-900 text-sm rounded-lg focus:ring-blue-500 focus:border-blue-500 block w-3/4 p-2.5" 
    hx-trigger="blur" 
    hx-headers='{"X-CSRFToken": "{{ csrf_token }}"}' 
    hx-post="{% url 'form' formId %}" 
    hx-vals='{"field": "{{ field }}", "value": "{{ value }}"}'>

如果仍有问题,可借助Django的json_script模板标签提前生成合法JSON,再在hx-vals中引用:

{% for field, value in data.items %}
    {% with field_val=field value_val=value %}
        {{ field_val|json_script:"field-{{ field }}" }}
        {{ value_val|json_script:"value-{{ field }}" }}
    {% endwith %}
    <div class='w-full h-28 p-1 m-5 flex flex-col mx-24'>
        <label for="{{ field }}" class="block mb-2 text-sm font-medium text-gray-900">{{ field }}</label>
        <input type="text" name="value" value="{{ value }}" 
            class="editable-field ..." 
            hx-trigger="blur" 
            hx-headers='{"X-CSRFToken": "{{ csrf_token }}"}' 
            hx-post="{% url 'form' formId %}" 
            hx-vals='js:{
                field: JSON.parse(document.getElementById("field-{{ field }}").textContent),
                value: JSON.parse(document.getElementById("value-{{ field }}").textContent)
            }'>
    </div>
{% endfor %}

方法2:使用hx-include包含隐藏字段

你已添加隐藏的input[name=field],给它设置唯一ID后,用hx-include指定包含该字段,HTMX会自动将其值加入请求:

{% for field, value in data.items %}
    <div class='w-full h-28 p-1 m-5 flex flex-col mx-24'>
        <label for="{{ field }}" class="block mb-2 text-sm font-medium text-gray-900">{{ field }}</label>
        <input type="hidden" id="hidden-field-{{ field }}" name="field" value="{{ field }}">
        <input type="text" name="value" value="{{ value }}" 
            class="editable-field ..." 
            hx-trigger="blur" 
            hx-headers='{"X-CSRFToken": "{{ csrf_token }}"}' 
            hx-post="{% url 'form' formId %}" 
            hx-include="#hidden-field-{{ field }}">
    </div>
{% endfor %}

这种方式无需依赖hx-vals,直接利用HTMX的表单字段包含功能,避免JSON解析问题。

方法3:用JS表达式动态获取值

通过hx-vals的JS表达式语法,直接从DOM中获取隐藏字段的值,规避模板渲染变量问题:

<input type="text" name="value" value="{{ value }}" 
    class="editable-field ..." 
    hx-trigger="blur" 
    hx-headers='{"X-CSRFToken": "{{ csrf_token }}"}' 
    hx-post="{% url 'form' formId %}" 
    hx-vals='js:{field: this.previousElementSibling.value, value: this.value}'>

this.previousElementSibling指向当前input前的隐藏字段,直接取其value作为field参数,同时用当前input的value作为value参数,动态获取更灵活。

后端验证建议

后端可先打印完整POST数据,确认字段是否存在:

def post(self, request, formId):
    print("完整POST数据:", request.POST)
    field = request.POST.get('field')
    value = request.POST.get('value')
    print("获取到的字段:", field, value)

若仍有问题,可通过浏览器开发者工具的Network面板,查看HTMX请求的Payload,确认field是否被正确包含。

内容的提问来源于stack exchange,提问作者CalledSidd

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 22:05:58