如何获取Jinja2生成的输入值数据?

7 投票
2 回答
17640 浏览
提问于 2025-04-18 08:27

在我的HTML文件中,我有:

  <table>
      {% for user in user_data_html %}
      <tr>
         <td>
            <input id="firstname" name="firstname" type="text" value='{{ user.FirstName }}' />  
         </td>
         <td>
             <input name="submit" type="submit" value='update' />
         </td>
     </tr>
     {% else %}
     <tr><td>no user found</td></tr>
     {% endfor %}
 </table>

我想通过点击每一行的更新按钮来修改网页上的用户名。但是我在后台使用以下的Python代码时,总是得到第一个“firstname”:

firstname = request.form['firstname']

我该如何解决这个问题呢?

2 个回答

1

request.form 是一个叫做 werkzeug.datastructures.MultiDict 的东西。你可以用它的 getlist 方法来获取某个字段的所有值:

a_firstname = request.form['firstname']
all_firstnames = request.form.getlist('firstname')

如果你想要字段的顺序和表单中定义的顺序一致,你需要创建一个 flask.Request 的子类,并把它的 parameter_storage_class 设置为 ImmutableOrderedMultiDict 的一个实例。然后,你还需要在你的 Flask 实例上设置 request_class 字段:

from flask import Flask, Request
from werkzeug.datastructures import ImmutableOrderedMultiDict

class OrderedRequest(Request):
    parameter_storage_class = ImmutableOrderedMultiDict

app = Flask(__name__)
app.request_class = OrderedRequest

这样一来,request.form.getlist('firstname') 就会按照浏览器发送的顺序返回字段(通常这个顺序和它们在 HTML 中定义的顺序是一致的)。

8

当你给每个输入框都用相同的名字时,表单会搞混淆。你可以选择在每个表格单元格周围创建一个单独的表单,或者使用jinja2的循环索引来生成独特的输入名字...

<input id="firstname{{ loop.index }}" name="firstname{{ loop.index }}" type="text" value='{{ user.FirstName }}' />

希望这对你有帮助!

撰写回答