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