使用Google App Engine中的JavaScript和服务器端Python代码动态生成客户端HTML表单控件

时间:2012-07-05 08:05:57

标签: javascript python google-app-engine

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

感谢。

1 个答案:

答案 0 :(得分:0)

<强>编辑

在模板内 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()

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


新[更好]解决方案

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

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