我有以下使用 Jinja2 模板引擎的客户端前端 HTML:
{% for record in result %}
<textarea name="remark">{{ record.remark }}</textarea>
<input type="submit" name="approve" value="Approve" />
{% endfor %}
因此 HTML 可能会显示多于一组的文本区域和提交按钮。
后端 Python 代码使用模型从 gql 查询中检索可变数量的记录,并将其传递给结果中的 Jinja2 模板。当点击提交按钮时,会触发 post 方法来更新记录:
def post(self):
if self.request.get('approve'):
updated_remark = self.request.get('remark')
record.remark = db.Text(updated_remark)
record.put()
但是,在某些情况下,更新的记录不是与单击的提交按钮相对应的记录(例如,如果用户单击记录 1 提交,则记录 2 备注会更新,但记录 1 不会更新)。
我推测这是由于重复的属性名称注释造成的。我可以使用 JavaScript/jQuery 来生成不同的属性名称。问题是,如何编写后端 Python 代码来获取 JavaScript 生成的(可变数量的)名称?
谢谢。
最佳答案
已编辑
在模板for循环中使用loop.index :循环的当前迭代。
然后:
{% for record in result %}
<textarea name="remark{{ loop.index }}">{{ record.remark }}</textarea>
<input type="submit" name="approve" value="{{ loop.index }}" />
{% endfor %}
返回:
<textarea name="remark1">first record remark</textarea>
<input type="submit" name="approve" value="1" />
<textarea name="remark2">second record remark</textarea>
<input type="submit" name="approve" value="2" />
<textarea name="remark2">third record remark</textarea>
<input type="submit" name="approve" value="3" />
并在您的后端代码中:
def post(self):
if self.request.get('approve'):
updated_remark = self.request.get('remark' + self.request.get('approve'))
record.remark = db.Text(updated_remark)
record.put()
我写这个没有测试它。可能不起作用,但可以给你一个提示。
<小时/>新的[更好]解决方案
将每对文本区域和输入放入表单中:
{% for record in result %}
<form>
<textarea name="remark">{{ record.remark }}</textarea>
<input type="submit" name="approve" value="Approve" />
</form>
{% endfor %}
关于javascript - 在 Google App Engine 中使用 JavaScript 和服务器端 Python 代码动态生成客户端 HTML 表单控件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11340220/