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

使用JavaScript实现Django表单数值自动求和,无需提交或刷新页面

问题修正说明

原有代码存在以下问题:

  • 仅在页面初始化时计算了一次总和,后续输入值变化不会重新计算
  • 未将输入框的字符串类型值转为数字,直接相加会出现字符串拼接的问题
  • 只给第一个输入框绑定了监听事件,修改第二个输入框的值不会触发更新
  • 没有判断两个输入框是否都填写完成的逻辑

修正后实现代码

JS逻辑

const input1 = document.getElementById('item_1_amount')
const input2 = document.getElementById('item_2_amount')
const totalDom = document.getElementById('Total')

function updateTotal() {
  // 输入值转数字,空值默认转0
  const val1 = Number(input1.value) || 0
  const val2 = Number(input2.value) || 0
  // 两个输入框都有值时显示总和,否则保留原占位符
  if (input1.value.trim() && input2.value.trim()) {
    // 金额场景保留两位小数,不需要可以去掉toFixed(2)
    totalDom.innerText = `$${(val1 + val2).toFixed(2)}`
  } else {
    totalDom.innerText = '$$'
  }
}

// 同时监听两个输入框的input事件,覆盖键盘输入、粘贴、数值调整等所有修改场景
input1.addEventListener('input', updateTotal)
input2.addEventListener('input', updateTotal)

Django Forms适配说明

你可以直接在Django表单类中定义字段属性,不需要手动写input标签,表单示例:

from django import forms

class AmountCalculateForm(forms.Form):
    item_1_amount = forms.DecimalField(
        label="第一项金额",
        widget=forms.NumberInput(attrs={
            "autocomplete": "off",
            "class": "form-control w-25",
            "id": "item_1_amount",
            "style": "float:left"
        })
    )
    item_2_amount = forms.DecimalField(
        label="第二项金额",
        widget=forms.NumberInput(attrs={
            "autocomplete": "off",
            "class": "form-control w-25",
            "id": "item_2_amount",
            "style": "float:left"
        })
    )

模板中直接渲染表单字段即可:

<tr>
 <td>
    <h6 style="float:left; margin-right:5px; margin-top:7px">$</h6>
    {{ form.item_1_amount }}
  </td>
  <td>
    <h6 style="float:left; margin-right:5px; margin-top:7px">$</h6>
    {{ form.item_2_amount }}
  </td>
</tr>
<tr>
<th>Total</th>
<th id="Total">$$</th>
</tr>

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 21:57:03