Flask和WTForms好奇地渲染问题

时间:2018-07-16 01:33:16

标签: python flask jinja2 wtforms

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

我有两条路线叫做“ / one /”和“ / two /”。路线一将呈现thefield不需要的表单。但是,第二种方法将把required=True参数传递给render函数(后者又将其传递给表单构造函数)。

在下面的示例中,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()}}

0 个答案:

没有答案