Flask,WTForms:有没有办法以_temporarily_隐藏的形式创建一个StringField?

时间:2016-03-14 13:33:30

标签: python flask wtforms flask-wtforms

这是我的模特:

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之间动态切换并返回。

2 个答案:

答案 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可调用字段。