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

如何使用hx-on在输入文本后启用Django站点中禁用的按钮?

用HTMX实现提交按钮的条件启用(禁用至输入理由)

需求与问题背景

在Django站点的封禁用户表单中,需要让"Yes"提交按钮默认处于禁用状态,仅当版主在textarea中输入封禁理由后才启用按钮。项目基于HTML和Django模板开发,希望通过HTMX实现纯前端交互,避免与服务器通信。此前尝试hx-on:input、hx-on:change事件未生效,hx-disabled-elt不符合纯前端交互的需求,相关方案多涉及服务器通信,不符合预期。

原代码如下:

<form method="POST">
      {% csrf_token %}
      <p>Please provide the reason for the ban.</p>
      <div class="input-group">
        <textarea
          class="form-control"
          aria-label="Reason for ban"
          name="reason-for-ban"
          hx-on:input="htmx.removeClass(htmx.find(#yes-ban-this-user), 'disabled')">
        </textarea>
      </div>
      <input
        type="submit"
        class="btn btn-danger w-100 mt-3 disabled"
        value="Yes" id="yes-ban-this-user"
      />
      <a
        href="{% url "user-profile" user.username %}"
        class="btn btn-secondary w-100 mt-1"
      >
        Cancel
      </a>
</form>

修正方案

问题核心在于两个细节:HTMX事件脚本中的ID选择器未加引号,且缺少内容清空时重新禁用按钮的逻辑。以下是修正后的完整代码:

<form method="POST">
    {% csrf_token %}
    <p>请输入封禁理由。</p>
    <div class="input-group">
        <textarea
            class="form-control"
            aria-label="封禁理由"
            name="reason-for-ban"
            hx-on:input="
                const btn = htmx.find('#yes-ban-this-user');
                if (this.value.trim().length > 0) {
                    htmx.removeClass(btn, 'disabled');
                    btn.disabled = false;
                } else {
                    htmx.addClass(btn, 'disabled');
                    btn.disabled = true;
                }
            "
        ></textarea>
    </div>
    <input
        type="submit"
        class="btn btn-danger w-100 mt-3 disabled"
        value="确认封禁"
        id="yes-ban-this-user"
        disabled
    />
    <a
        href="{% url "user-profile" user.username %}"
        class="btn btn-secondary w-100 mt-1"
    >
        取消
    </a>
</form>

关键说明

  • ID选择器引号:htmx.find()的参数必须是字符串,因此ID需要添加单引号或双引号(如htmx.find('#yes-ban-this-user')),原代码缺少引号导致脚本执行报错。
  • 双向状态控制:增加了内容为空时的判断逻辑,当用户清空textarea后,按钮会重新回到禁用状态,符合完整的交互流程。
  • 原生disabled属性:除了操作CSS的disabled类,还同步设置按钮的原生disabled属性,仅靠CSS类无法阻止浏览器默认的表单提交行为,双管齐下才能确保按钮状态生效。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 22:12:46