【问题标题】:Contained submit button validating other forms包含验证其他表单的提交按钮
【发布时间】:2021-06-12 07:29:52
【问题描述】:

我的页面上有两个表单,每个表单都有自己的字段和提交按钮,但每当我使用其中任何一个时,它们总是会检查整个页面字段,而不仅仅是它们包含的表单...

simulator.html有两种形式,第一种是这样的:

<div class="forms">
 <div class="form-1">
  <form method="post" action="{{ url_for('core.simulator') }}">
   <div class="container">
    <div class="row g-3">
     <div class="col-sm-3">
      <label class="form-label"><b>Capital:</b></label>
      <input type="text" class="form-control" name="capital_html" required>
     </div>
     <div class="col-sm-3">
      <label class="form-label"><b>Price:</b></label>
      <input type="text" class="form-control" name="price_html" required>
     </div>
    </div>
   </div>
   <br>
   <div class="d-grid gap-2 d-md-flex justify-content-md-start">
    <button id="btn" type="submit" class="btn btn-info">Launch simulation!</button>
   </div>
  </form>
  <br>
   <p>Units to purchase: <b>{{simulation_units}}</b>
 </div>
</div>

第二个是这样的:

<h3> Screener</h3>
 <div class="forms">
  <div class="form-2">
   <form method="post" action="{{ url_for('core.simulator') }}">
    <div class="container">
     <div class="row g-3">
      <div class="col-sm-3">
       <label class="form-label"><b>Ticker:</b></label>
       <input type="text" class="form-control" name="ticker_symbol_html" placeholder="Enter Ticker Symbol" required>
      </div>
     </div>
    </div>
    <br>
   <div class="d-grid gap-2 d-md-flex justify-content-md-start">
     <button id="btn" type="submit" class="btn btn-info">Launch!</button>
   </div>
   <p>Symbol <b>{{simulation_symbol}}.
  </form>
 </div>
</div>

views.py 文件有每个的后端代码,第一个是这样的:

def capital_simulator():
    if request.method == 'POST':
       simulation_capital = request.form.get('capital_html', '')
       simulation_price = request.form.get('price_html', '')

       try:
          simulation_units = math.floor(float(simulation_capital) / float(simulation_price))
       except KeyError:
       simulation_units == 0

       return render_template('simulator.html',form1=form,capital_html=simulation_capital,price_html=simulation_price,simulation_units=simulation_units)

第二个表单后端脚本是这样的:

def screener():
    if request.method == 'POST':
       ticker_symbol = request.form.get('ticker_symbol_html', '')

       return render_template('simulator.html',ticker_symbol=ticker_symbol_html,ticker_symbol=simulation_symbol)

我认为通过专门调用提到的字段并将它们包含到表单类中,我会避​​免整体验证,但现在我无法让提交按钮专注于他们自己的表单。请问如何解决这个问题?

【问题讨论】:

  • 您的&lt;form&gt; 标签是相同的。您的后端如何知道提交了哪个表单?
  • @TimRoberts,你的意思是
    ?还是我看错地方了?
  • &lt;div&gt; 标签在表单提交中不起作用。 &lt;form&gt; 标签指示请求被发送到哪里,&lt;input&gt; 被发送。鉴于此,您的后端如何知道提交了哪个表单?
  • @TimRoberts ,好的,我现在了解错误,请问如何解决?我认为simulation_capital = request.form.get('capital_html', '') 足以说明提要的去向...
  • 不,浏览器只会向您发送单击按钮的表单内容。您不会获得页面上的所有表单。

标签: python flask bootstrap-4


【解决方案1】:

你有两种形式。一个在'form-1' div 内。一个在'form-2' div 内。每个都有自己的&lt;form&gt;&lt;/form&gt; 标签,这意味着它们是单独的表单。第一个表单包含两个 字段:一个名为 capital_html,一个名为 price_html,一个按钮名为 btn。第二种形式有一个名为ticker_symbol_html&lt;input&gt; 字段和一个名为btn 的按钮。

假设用户填写了前两个字段并单击了第一个按钮。这将向

标记中的任何 URL 发送请求。在数据中,它会发送三样东西:
capital_html=xxx
price_html=yyy
btn=submit

就是这样。这就是你所得到的。您不会从其他表单中获得任何字段。如果用户点击另一个表单,你将得到的只是

ticker_symbol_html=xxx
btn=submit

如您所见,问题在于您无法轻松判断提交了哪个表单。如果您必须为两者使用相同的 URL,解决此问题的常用方法是添加一个与数据一起发送的隐藏字段,例如:

<input type=hidden name="ident" text="form1">

在第二个中:

<input type=hidden name="ident" text="form2">

现在,您的处理程序可以说

    if request.form.get("ident") == "form1":
        # Go handle first form.
    else:
        # Go handle second form.

【讨论】:

    猜你喜欢
    相关资源
    最近更新 更多
    热门标签