python - 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()}}