Flask,WTForms:有没有办法使 StringField _temporarily_ 隐藏?
Flask, WTForms: Is there a way to make a StringField in the form _temporarily_ hidden?
这是我的模型:
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 之间动态切换并返回。
你可以这样做
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)
虽然也可以像您一样在视图中完成,但最好将表单逻辑保留在您的表单中 class。
据我所知,将字段更改为 HiddenField 并不是一个好主意。
然而,您可以做的是让字段保持原样,但替换它的 小部件 以便它呈现为隐藏状态。相关的小部件是 wtforms.widgets.HiddenInput
.
注意:这是在 Python3 完成的。
使用 hide_a()
方法(您调用的方法 __MakeTemporarilyHidden__
)扩展您的表单 class:
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
可调用对象。
这是我的模型:
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 之间动态切换并返回。
你可以这样做
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)
虽然也可以像您一样在视图中完成,但最好将表单逻辑保留在您的表单中 class。
据我所知,将字段更改为 HiddenField 并不是一个好主意。
然而,您可以做的是让字段保持原样,但替换它的 小部件 以便它呈现为隐藏状态。相关的小部件是 wtforms.widgets.HiddenInput
.
注意:这是在 Python3 完成的。
使用 hide_a()
方法(您调用的方法 __MakeTemporarilyHidden__
)扩展您的表单 class:
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
可调用对象。