【问题标题】:dynamically submit form when values change python当值更改python时动态提交表单
【发布时间】:2020-11-23 07:56:51
【问题描述】:

我是 html 和 Django 的新手,并试图让我的表单在用户更改输入时动态自动提交,基本上删除了“提交”按钮。

我的表单有 3 个输入(所有浮点数),它们将通过“some_function()”进行计算。但是为了节省用户时间,我希望它是动态的。因此,没有“提交”。

HTML:

    <div class="container">
          <h3>Calculator</h3>
          <form method="post" >
              {% csrf_token %}
              {{ form_c.as_p }}
              <button type="submit">Submit</button> # <- I would like to remove this
          </form>
    </div>

如果需要,我的视图如下:

 def post(self, request):
        form_c = CalculatorForm(request.POST, prefix='form_c')
        try:
            if form_c.is_valid():
                post = form_c.cleaned_data
                val1 = float(post.get('val1'))
                val2 = float(post.get('val2'))
                val3 = float(post.get('val3'))
                numbers = some_function(val1, val2, val3)

        except:
            pass

        args = {
            'form_c': form_c, 'form_cols': numbers,
        }
        return render(request, self.template, args)

(编辑)表格:

class CalculatorForm(forms.Form):
    val1 = forms.DecimalField(decimal_places=2, min_value=0.0, required=False)
    val2 = forms.DecimalField(decimal_places=2, min_value=0.0, required=False)
    val3 = forms.DecimalField(decimal_places=2, min_value=0.0, required=False)

【问题讨论】:

  • 这是一个javascript问题。您需要您的 JS 进行验证,然后在所有字段都填写并有效后发送请求。但是,如果您在新数据和有效数据的条件下发送该请求,some_function 可能会被调用任意次数。此外,新的有效数据并不总是预期的数据。
  • @Codesidian 所以这对于我目前拥有的东西是不可能的?你知道在 JS 中是如何实现的吗?我以前从未使用过它。干杯
  • 不,用你当前拥有的 是不可能的,但是实现你想要的功能将是非常微不足道的。但是,我强调的是更多的设计问题,而不是任何特定于您当前实现的问题。问你是否应该而不是你是否可以。如果 some_function 可以运行任意次数,那么可以确定。它可以安全地使用无意的数据运行吗?每个用户应该运行很多次吗?您请求的功能不受欢迎是有原因的。

标签: python html django dynamic


【解决方案1】:

这将以最简单的方式实现您的要求。虽然我没有测试过,但逻辑就在那里。您可以在 JS 中创建验证和提交函数,然后在使用 onChange 属性更改输入字段时调用它。 You just need to add the attribute to your inputs。您也可以只使用add event listeners to your inputsuse jQuery 来取消 onchange 属性。这取决于你。

view.py

def post(self, request):
        form_c = CalculatorForm(request.POST, prefix='form_c')
        try:
            if form_c.is_valid():
                post = form_c.cleaned_data
                val1 = float(post.get('val1'))
                val2 = float(post.get('val2'))
                val3 = float(post.get('val3'))
                numbers = some_function(val1, val2, val3)

        except:
            pass

        args = {
            'form_c': form_c, 'form_cols': numbers,
        }
        return render(request, self.template, args)

HTML

<div class="container">
      <h3>Calculator</h3>
      <form method="post" id="myform" name="myform">
          {% csrf_token %}
          {{ form_c.as_p }}
      </form>
</div>

JavaScript

function validate_then_submit() {
    var valid = false;
    //validate form here
    if (valid == true) {
        document.forms['myform'].submit();
    }
}

forms.py

class fooForm(forms.Form):
    char_field = forms.CharField(widget=forms.TextInput(attrs={'onChange':'validate_then_submit()'}))

但是,我认为这些都不是好的设计。如果表单在数据“有效”后立即提交,如果出现拼写错误怎么办?它会从用户手中夺走控制权,并以意想不到的方式行事。

【讨论】:

  • 谢谢!我还没有完全工作,但会告诉你。我应该对表格更清楚(我在我的问题中添加了我的表格)。我同意你的说法,但我希望 DecimalField 中的这些限制不会成为问题。我希望它表现得像 excel,所以当值改变时,输出也会改变。
猜你喜欢
  • 2015-01-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-31
  • 1970-01-01
  • 2017-08-01
  • 1970-01-01
相关资源
最近更新 更多