首页 > 解决方案 > 使用 Flask 通过 HTML 表单中的动态行指定用户输入

问题描述

在 HTML 中,我有一个表格,表格中有 4 个用户输入。但是,动态显示的行数会有所不同。

<form action="/edit" method="post">
 <table>
  <tbody>
   {% for row in profile_display['rows'] %} <!--# of rows that appear depend on this-->
    <tr>                             
     <td> <!--user input 1-->
      <form>
       <input id={{row[0]~'seq'}} name='seq' class="w-75" type="number" step=1 value="{{row[0]}}" ondblclick="editSeq(`{{row[0]~'seq'}}`);" readonly>             
      </form>
     </td>
     <td> <!--user input 2-->
      <form>
       <input id={{row[0]~'code'}} name='ing_code' class="w-75" value="{{row[1]}}" ondblclick="editCode(`{{row[0]~'code'}}`)" readonly>
      </form>
     </td>
     <td>{{row[2]}}</td>                
     <td> <!--user input 3-->
      <form>
       <input id={{row[0]~'weight'}} name='weight' class="w-75" type="number" step=.001 value="{{row[3]}}" ondblclick="editWeight(`{{row[0]~'weight'}}`);" readonly>
      </form>
     </td>
     <td> <!--user input 4-->
      <form>
       <input id={{row[0]~'ret'}} name='ret_code' class="w-75" value="{{row[4]}}" ondblclick="editRet(`{{row[0]~'ret'}}`)" readonly>
      </form>
     </td> 
   </tbody>
  </table>
<input type="submit">
</form>

在 Python 中,我正在尝试创建一个函数来更新数据框 profile_df,其中包含预先存在的数据,但可以根据 HTML 表单中的用户输入进行更新。

@app.route('/edit', methods=['GET', 'POST'])
def edit():
global profile_df
if request.method == 'POST':
    profile_df=profile_df[profile_df['Food code']==food_display['Food Code']] 
    for index, row in profile_df.iterrows():
        row['Seq num']=request.form.get('seq') 
        row['Ingredient code']=request.form.get('ing_code')
        row['Ingredient weight (g)']=request.form.get('weight')
        row['Retention code']=request.form.get('ret_code')
return redirect('/')     

虽然我可以使用 row['col'] 准确指定要在 profile_df 中更新哪些单元格,但我不知道如何准确指定要从中获取用户输入的单元格。我知道我可以使用表单中的“名称”属性来获取用户输入,我正在这样做,但由于表单中的行数不同,仅通过“名称”获取是行不通的。我正在考虑通过以某种方式指定行来进一步缩小 request.form.get 的范围,但不确定如何去做。以下是我的尝试,它不起作用,但希望能明确我的意图。基本上,我试图进一步指定用户输入以名称和其他内容出现的确切行(# 行不同)。

@app.route('/edit', methods=['GET', 'POST'])
def edit():
global profile_df
if request.method == 'POST':
    profile_df=profile_df[profile_df['Food code']==food_display['Food Code']] 
    for index, row in profile_df.iterrows():
        row['Seq num']=row[request.form.get('seq')]
        row['Ingredient code']=row[request.form.get('ing_code')]
        row['Ingredient weight (g)']=row[request.form.get('weight')]
        row['Retention code']=row[request.form.get('ret_code')]
return redirect('/')


 

标签: pythonhtmlformsflaskpost

解决方案


我不认为你可以那样做。表单中的“名称”标签必须是唯一的,否则它只是覆盖。我会像你对'id'所做的那样为每一行做不同的'name',然后这样:

for name, value in request.form.items():
    print(name, value)

推荐阅读