从表单中的 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>
我有一个成员列表,来自 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>