首页 > 解决方案 > Flask 和 WTForms 奇怪的渲染问题

问题描述

我在 Flask 中重用渲染函数来渲染简单表单(使用 WTForms(不是 Flask-WTForms))有一个特定的问题。下面是重现问题的代码的简化版本。

我有两条路线,分别称为“/one/”和“/two/”。路线一将呈现thefield不需要的表单。然而,路由二会将一个required=True参数传递给渲染函数(该函数又将它传递给表单构造函数)。

在下面的示例中,该render()函数当然是无关紧要的,因为我可以直接在“一”和“二”路由中构造类,但在实际代码中,我以这种方式抽象出来的函数中Form发生了更多事情。render()

现在出现的奇怪问题是,当我第一次访问/one/该字段时,不需要(正确)。然后我访问/two/并且该字段是必需的(也是正确的)。但是当我现在再次访问路线/one/时,该字段也突然变得必需。现在,无论在任何情况下,都需要在/one/和场之间进行多少次触发器。/two/

除非我重新启动服务器,在这种情况下,第一次访问/one/将再次显示正确的可选字段并重复循环。

如果我打印self.required表单类的构造函数内部的实际值,如果我在路由之间跳转,我会得到正确的值。但是,HTML 输出不正确。

我很确定这里发生了一些显而易见的事情,但我似乎看不到光......

Python代码:

from wtforms import Form, TextField
from wtforms.validators import Optional, InputRequired
import flask

app = flask.Flask('app')

class TheForm(Form):
  def __init__(self, *args, **kwargs):
      super(self.__class__, self).__init__(*args, **kwargs)
      self.required = kwargs.get('required')
      if self.required:
          self.thefield.validators.append(InputRequired())

  thefield = TextField('Fancy label',
                       validators=[Optional()])


def render(required=False):
  form = TheForm(required=required)

  return flask.render_template('template.html',
                               form=form)


@app.route('/one/')
def one():
    return render()


@app.route('/two/')
def two():
    return render(required=True)

Jinj2 模板:

{{form.thefield.label}}
{% if form.thefield.flags.required %}*{% endif %}
{{form.thefield()}}

标签: pythonflaskjinja2wtforms

解决方案


推荐阅读