【问题标题】:How to load Jinja2 template with values after form submission表单提交后如何使用值加载 Jinja2 模板
【发布时间】:2016-05-12 10:24:21
【问题描述】:

我在 Jinja2 模板中有一个表单。这就是我想要做的:

  • 在用户提交表单后,后端的处理程序将一个 异步任务。
  • 然后,处理程序重新加载当前页面并填充表单 使用用户提供的值。

最好的方法是什么? 例如,假设我的表单中有一个 <select> 输入,如下所示:

  <select id="shift_selected" name="shift_selected">
  {% for shift in Shifts %}
    <option value="{{ shift }}" {{ 'selected' if shift == selected_shift }}>{{ shift }}</option>
  {% endfor %}
  </select>

现在在表单提交后重新渲染页面,

  • 我的处理程序必须解析输入,获取 'shift_selected' 的值

  • 然后设置'selected_shift'的值。

args['selected_shift'] = self.request.get("selectedShift")

template.render(args)

处理程序本质上接收表单值中的一些数据,并将相同的数据作为模板变量值发送回。有一个更好的方法吗。如果是长篇大论,这种方法是相当乏味的。

【问题讨论】:

  • post(收集用户输入)和get(重绘页面)操作是 2 个独立的客户端请求,Web 服务器不知道它们实际上是相关的(可能会处理2 个相关请求之间的一堆其他请求),因此服务器端应用程序需要解析和持久化要在请求之间共享的每条数据(整个上下文)并使它们相关.
  • 如果表单填充逻辑是完全独立的(不需要额外的服务器端信息),也可以在客户端运行它(例如 JS 脚本)并发布将数据收集到服务器(到不同的处理程序) - 但我不知道在这种情况下是否/如何使用 jinja 模板(或者这是否属于您的问题的上下文)。

标签: python-2.7 google-app-engine jinja2


【解决方案1】:

实际上,您甚至可以将request 对象作为参数传递给Jinja 模板。或者编写一个函数,将request中的所有GET或POST参数复制到Jinja模板参数中。

args['request'] = self.request
template.render(args)

<select id="shift_selected" name="shift_selected">
{% for shift in request.get('selectedShift') %}
    <option value="{{ shift }}" {{ 'selected' if shift == selected_shift }}>{{ shift }}</option>
{% endfor %}
</select>

【讨论】:

  • 有没有例子说明如果直接传递请求对象在模板中是如何渲染的。
猜你喜欢
  • 2016-03-25
  • 2019-11-02
  • 2019-11-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-24
  • 1970-01-01
相关资源
最近更新 更多