这是我的模特:
class F(Form):
a = StringField('a', validators = [validators.DataRequired()])
有没有办法让表格中的StringField暂时隐藏?类似的东西:
@app.route('/f', methods = ['GET', 'POST'])
def f():
form = F(request.form)
if foo(form):
form.a.__MakeTemporarilyHidden__()
else:
form.a.__MakeItVisibleAgain__()
if request.method == 'GET':
return render_template('f.html', form = form)
我知道wtforms.fields.HiddenField但我想在StringField和HiddenField之间动态切换并返回。
答案 0 :(得分:3)
您可以执行类似
的操作class F(Form):
a = StringField('a', validators = [validators.DataRequired()])
def __init__(self, *args, **kwargs):
hide_a = kwargs.pop('hide_a')
super(F, self).__init__(*args, **kwargs)
if hide_a:
self.a.widget = widgets.HiddenInput()
@app.route('/f', methods = ['GET', 'POST'])
def f():
if foo():
form = F(request.form, hide_a=True)
else:
form = F(request.form)
if request.method == 'GET':
return render_template('f.html', form = form)
虽然它可以像你一样在视图中完成,但最好在Form类中保留表单逻辑。
答案 1 :(得分:0)
据我所知,将字段更改为HiddenField并不是一个好主意。
然而,您可以做的是保持字段不变,但替换其小部件以使其呈现为隐藏状态。相关小部件为wtforms.widgets.HiddenInput
。
注意:这是在Python3上完成的。
使用hide_a()
方法扩展您的表单类(您所谓的__MakeTemporarilyHidden__
):
from wtforms.widgets import HiddenInput
class F(Form):
a = StringField('a', validators = [validators.DataRequired()])
def hide_a(self):
a.widget = HiddenInput()
您可能需要将a.data
设置为某个值。如果该字段为SelectField
,您甚至可能需要向该字段添加_value
可调用字段。