从表格中获取第n个项目 - python / google app engine / jinja2

时间:2015-06-26 13:45:19

标签: python google-app-engine jinja2

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

我希望能够从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 Engine中的

- 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”)只返回为for循环的第一次迭代选择的选项。

复选框; self.request.get(“in_out”),按预期返回或关闭。

所以提交for循环的第n次迭代: 始终从select / option返回“Monday”。

如何获得与for循环的第n次迭代相对应的select /选项?

谢谢!

3 个答案:

答案 0 :(得分:1)

最简单的解决方案是将表单标记移动到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>

答案 1 :(得分:0)

因此,您的结果表单有多个具有相同名称的字段,对吧?

与第一个成员一样,有一个和第二个成员,还有一个?

如果是这样,表单不支持。您必须为每个字段指定唯一的名称。你必须在循环的每次迭代中抛出一个memberID,或者想出一个更好的设计。像<select name="day{{member.id}}">这样的东西会是一个黑客修复。

另一种方法是让你离开for循环的in_out和day OUT,把它放在外面。

我希望有所帮助。

答案 2 :(得分:0)

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

而不是

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

我用过

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

返回select中所有选项的列表,包括用户为该成员选择的选项。

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

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

我指定了名称&#34; loop&#34;值{{loop.index0}}

所以,

self.request.get("loop")

返回所选成员的位置,对应目标日期列表中的位置。瞧。

我从隐藏的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。