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

如何通过HTMX获取元素值?从表单按钮切换到SVG的问题

问题描述

原本用form+button实现点赞功能,代码正常运行:

<form method="POST" action="{% url 'posts:like_post' post.pk %}">
{% csrf_token %}
{% if user.is_authenticated %}
    <button type="submit" name='post_id' value="{{ post.id }}">Like</button>
{% else %}
    <a href="{% url 'pages:login' %}"><u>Login</u> to like</a>
{% endif %}
</form>

尝试换成SVG+HTMX的方式后,无法获取post_id的值,SVG代码如下:

<svg hx-post="{% url 'posts:support_post' post.pk %}" 
     hx-headers='{"X-CSRFToken": "{{ csrf_token }}"}' 
     name='post_id' value="{{ post.id }}" 
     class="some_class" 
     xmlns=...>
</svg>

对应的Django视图中,原form方式用request.POST.get('post_id')能正常获取值,但HTMX方式用request.htmx.trigger_name只能拿到post_id这个名称,拿不到对应的值:

def LikeView(request, pk):
    # 原form方式可行:
    # post = get_object_or_404(Post, id=request.POST.get('post_id'))
    # HTMX方式无法获取值:
    # post = get_object_or_404(Post, id=request.htmx.trigger_name)

核心问题:HTMX场景下,替代request.POST.get('post_id')获取元素值的方法是什么?

解决方案

方法1:用hx-vals直接传递参数

SVG不属于表单控件,HTMX不会自动提交它的name和value属性。可以通过hx-vals把post_id作为请求参数发送:

<svg hx-post="{% url 'posts:support_post' post.pk %}" 
     hx-headers='{"X-CSRFToken": "{{ csrf_token }}"}' 
     hx-vals='{"post_id": "{{ post.id }}"}'
     class="some_class" 
     xmlns=...>
</svg>

这时在视图里依然用request.POST.get('post_id')就能获取到值,和原form方式完全兼容。

方法2:直接用URL中的pk参数

注意到你的HTMX请求URL已经包含了post.pk,视图函数也接收pk参数,直接用这个参数就能获取Post对象,不需要额外传递post_id:

def LikeView(request, pk):
    post = get_object_or_404(Post, id=pk)
    # 后续点赞逻辑...

这种方式最简洁,省去了额外参数传递的步骤。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 09:47:34