1

我有以下使用 Jinja2 模板引擎的客户端前端 HTML:

{% for record in result %}
    <textarea name="remark">{{ record.remark }}</textarea>
    <input type="submit" name="approve" value="Approve" />
{% endfor %}

因此 HTML 可能会显示超过 1 组的 textarea 和提交按钮。

后端 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 生成的(可变数量)名称?

谢谢。

4

1 回答 1

0

已编辑

在循环模板使用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()

我没有测试就写了这个。可能不起作用,但可以给你一个提示。


新的[更好]解决方案

将每对 textarea 和 input 放入一个表单中:

{% for record in result %}
    <form>
        <textarea name="remark">{{ record.remark }}</textarea>
        <input type="submit" name="approve" value="Approve" />
   </form>
{% endfor %}
于 2012-07-05T08:47:19.513 回答