Указание пользовательских вводов динамической строкой из HTML-формы с помощью Flask

#python #html #forms #flask #post

Вопрос:

В 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('/')     
 

Хотя я могу точно указать, какие ячейки следует обновить в profile_df, используя строку[‘col’], я не знаю, как точно указать, из каких ячеек следует извлекать пользовательский ввод. Я знаю, что могу захватить пользовательский ввод, используя атрибут » имя «в форме, что я и делаю, но, поскольку количество строк в форме варьируется, просто захватить» имя » не сработает. Я подумываю о том, чтобы сузить запрос.форма.получить еще больше, каким-то образом указав строку, но не уверен, как это сделать. Ниже приведена моя попытка, которая не работает, но, надеюсь, проясняет мои намерения. В принципе, я пытаюсь дополнительно указать точную строку (# строк варьируется), в которой ввод пользователя отображается как по имени, так и по чему-то еще.

 @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('/')


 
 

Ответ №1:

Я не думаю, что ты можешь сделать это таким образом. тег » имя » в форме должен быть уникальным, в противном случае он просто переопределяется. Я бы сделал другое » имя «для каждой строки, как вы сделали с «идентификатором», а затем сделал бы это таким образом:

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