【问题标题】:get nth item from for loop in a form - python/google app engine/jinja2从表单中的 for 循环中获取第 n 个项目 - python/google app engine/jinja2
【发布时间】:2015-06-26 13:45:19
【问题描述】:

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

我希望能够从 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 次迭代: “星期一”总是从选择/选项返回。

如何获取与 for 循环的第 n 次迭代对应的选择/选项?

谢谢!

【问题讨论】:

    标签: python google-app-engine jinja2


    【解决方案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>
    

    【讨论】:

    • 啊@gipsy 你这个混蛋,真是天才。我没用的原因是什么? PyCharm 给了我一条错误消息,指出 for 循环中不允许使用
      元素。嘿 Pycharm,解决它!
    【解决方案2】:

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

    就像第一个成员有一个,第二个成员也有一个?

    如果是这样,表单不支持。您必须为每个字段设置一个唯一的名称。您必须在循环的每次迭代中输入一个 memberID,或者提出更好的设计。像 &lt;select name="day{{member.id}}"&gt; 这样的东西会是一个 hacky 修复。

    另一种方法是您只需将 for 循环的 in_out 和 day OUT 留在外面。

    希望对你有帮助。

    【讨论】:

    • 谢谢@Aerodyno,这确实有帮助。你是对的,我希望从表单中提取一些东西,这需要一个唯一的名称属性。有没有办法可以将下拉列表保留在表单中?我真的,出于设计原因,不想把它放在外面。
    【解决方案3】:

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

    而不是

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

    我用过

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

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

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

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

    我指定了名称“循环”和值 {{ 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)]
    

    妮妮丝。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-11-24
      • 1970-01-01
      • 2011-01-22
      • 1970-01-01
      • 1970-01-01
      • 2023-03-03
      • 1970-01-01
      相关资源
      最近更新 更多