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

如何在Django模板循环中使用JavaScript获取多个输入值?

问题原因与解决方案

问题根源

HTML规范明确要求id属性值必须是唯一的,你通过Django循环渲染时,生成了多个id为odds和amount的输入框,而document.getElementById()只会返回页面中第一个匹配该id的元素,所以每次打印都只能拿到第一个输入框的odds值。

另外还有个隐藏问题:你把CalculateNewBalance函数定义在循环内部,这会导致页面生成多份完全相同的函数定义,不仅冗余,还可能引发不必要的冲突。

解决方法

这里提供两种实用的修改方案,任选其一即可:

方案一:通过父元素关联对应输入框(推荐)

利用输入框所在的表单作为上下文,用class标识同类元素,避免依赖唯一id:

{% for p in prediction.prediction_data.all %}
  <form action="#" method="POST" class="prediction-form">
     <!-- 用class标记odds输入框,id可选但建议唯一 -->
     <input type="text" value="{{ p.odds }}" class="odds-input" id="odds-{{ p.id }}">
     <!-- 触发事件时传递当前输入框对象 -->
     <input type="number" value="" name="amount" class="amount-input" onkeyup="CalculateNewBalance(this)">
  </form>
{% endfor %}

<!-- 把函数移到循环外,只定义一次 -->
<script>
  function CalculateNewBalance(amountInput) {
      // 通过当前输入框找到所属的表单
      const parentForm = amountInput.closest('.prediction-form');
      // 在表单内找到对应的odds输入框
      const odds = parentForm.querySelector('.odds-input').value;
      console.log(odds);
  }
</script>

方案二:给每个元素生成唯一id

利用Django循环的计数器或对象id生成唯一id,在事件中传递标识来定位元素:

{% for p in prediction.prediction_data.all %}
  <form action="#" method="POST">
     <!-- 用p的id生成唯一id -->
     <input type="text" value="{{ p.odds }}" id="odds-{{ p.id }}">
     <!-- 触发事件时传递当前项的id -->
     <input type="number" value="" name="amount" id="amount-{{ p.id }}" onkeyup="CalculateNewBalance('{{ p.id }}')">
  </form>
{% endfor %}

<script>
  function CalculateNewBalance(itemId) {
      // 通过拼接的唯一id获取对应输入框的值
      const odds = document.getElementById(`odds-${itemId}`).value;
      console.log(odds);
  }
</script>

关键修改点总结

  • 确保页面中每个元素的id唯一,或者放弃用id定位,改用class+父元素上下文
  • 将函数定义移到循环外部,避免重复定义
  • 触发事件时传递足够的上下文信息,让函数能精准定位到对应的元素

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 11:46:05