从表单中的 for 循环中获取第 n 个项目 - python/google app engine/jinja2

get nth item from for loop in a form - python/google app engine/jinja2

我有一个成员列表,来自 jinja2 中的一个 for 循环,带有 select 和选项

我希望能够 select 来自 for 循环的成员之一, 并将该成员添加到事件的另一个条目列表中,并为用户提供额外的选项。 (获取成员很容易,从按钮的值,获取选项是问题)

例如:

Jinja2 模板:

<form method="post" action="add_member_to_list">
  <table>
  {% for member in members %}
    <tr>
      <th>{{ member.name }}</th>
      <td><input type="checkbox" name="in_out"></td>
      <td><select name="day">
            <option>Monday</option>
            <option>Wednesday</option>
          </select>
      </td>
      <td><button type="submit" name="id" value="{{ member.id }}">Add</button></td>
    </tr>
  {% endfor %}
  </table>
</form>

在 Google App 引擎中 - Python

class AddUser(BaseHandler):
    def post(self):
        in_out = self.request.get("in_out")
        id = self.request.get("id")
        day = self.request.get("day")

在这种情况下,self.response.get("day") 仅 returns 选项 select 为 for 循环的第一次迭代编辑。

复选框; self.request.get("in_out"),returns 按预期打开或关闭。

因此提交 for 循环的第 n 次迭代: "Monday" 总是从 select/option 返回。

如何获取for循环第n次迭代对应的select/option?

谢谢!

所以您生成的表单有多个同名字段,对吗?

对于第一个成员,有一个,对于第二个成员,也有一个 ?

如果是这样,则表单不支持。每个字段都必须有一个唯一的名称。您必须在循环的每次迭代中加入一个 memberID,或者想出一个更好的设计。 <select name="day{{member.id}}"> 之类的东西将是一个 hacky 修复。

另一种方法是将 in_out 和 day OUT 留在 for 循环之外,将其放在外面。

希望对您有所帮助。

我找到了一个非常简单的解决方案:

而不是

day = self.request.get("day")

我用过

day = self.request.get_all("day")

其中 returns 来自 select 的所有选项的列表,包括用户为成员选择的选项。

然后,对于添加按钮,而不是

<td><button type="submit" name="id" value="{{ member.id }}">Add</button></td>

我分配了名称 "loop" 和值 {{ loop.index0}}

所以,

self.request.get("loop")

returns成员selected的位置,对应target在日列表中的位置。瞧。

我从隐藏的 td 而不是从提交按钮获得的成员。

最终代码:

<form method="post" action="add_member_to_list">
  <table>
    {% for member in members %}
     <tr>
       <th>{{ member.name }}</th>
       <td><input type="checkbox" name="in_out"></td>
       <td>
         <select name="day">
          <option>Monday</option>
          <option>Wednesday</option>
         </select>
       </td>
       <td class="hidden"><input name="id" value="{{ member.id }}"></td>
       <td><button type="submit" name="loop" value="{{ loop.index0 }}">Add</button></td>
    </tr>
  {% endfor %}
 </table>
</form>

class AddUser(BaseHandler):
    def post(self):
        day = self.request.get_all("day")
        id = self.request.get_all("id")
        loop = self.request.get("loop")
        target_day = day[int(loop)]
        target_id = id[int(loop)]

Niiice.

最简单的解决方案是将表单标记移动到您的 for 循环中

  <table>
  {% for member in members %}
<form method="post" action="add_member_to_list">
    <tr>
      <th>{{ member.name }}</th>
      <td><input type="checkbox" name="in_out"></td>
      <td><select name="day">
            <option>Monday</option>
            <option>Wednesday</option>
          </select>
      </td>
      <td><button type="submit" name="id" value="{{ member.id }}">Add</button></td>
    </tr>
</form>
  {% endfor %}
  </table>