将以前表单中定义的变量传递给另一种形式

时间:2016-07-05 13:34:31

标签: python-2.7 flask flask-wtforms

所以我有一个我正在制作的烧瓶应用程序,我需要一些变量访问帮助。

大多数情况下,当您在flask中定义表单时,您将执行以下操作:

class MyForm(Form):
    my_field = StringField('I'm a field')
    my_submit = SubmitField('Go!')

当您需要表单时,您将使用form = MyForm()

声明该类的实例

到此为止,这一切都很好,但是:

如果你想说,SelectField(下拉列表)选项取决于前一个表单的答案,你需要能够为新表单提供这些选择。这就是我想要实现的目标,但我无法获得一个变量来保存其内容。

这是我的表单代码(高于页面代码):

class DataMappingForm(Form):

    dm_choices = #I need this array !

    DMpatient_id = SelectField(u'Select Patient ID Column', 
            choices=dm_choices, validators=[Required()])
    ...

这是我的网页代码:

@app.route('/upload', methods=['GET','POST'])
def upload():
    uform = SomeOtherForm()
    if uform.is_submitted() and uform.data['Usubmit']:
        #Do stuff from previous form
        # and declare array_of_choices
    dmform = DataMappingForm() #Needs array_of_choices to work
    ...

到目前为止我尝试过:

  • session ['dm_choices']给了我一个working outside of request context错误
  • 全局变量,由于某种原因而重置
  • 通过添加数组重载了Form的__init__但我无法在__init__函数上方的部分中访问它。

我应该提一下,这一切都需要在同一页上。

有没有办法将此array_of_choices传递给我的DataMappingForm班级?

编辑当我试图__init__重载时,这就是它的样子:

class DataMappingForm(Form):
     def __init__(self, dm_choices, *args, **kwargs):
         self.dm_choices = dm_choices
         Form.__init__(self, *args, **kwargs)

     DMpatient_id = SelectField(u'Select Patient ID Column', 
             choices=dm_choices, validators=[Required()])
#I've tried putting it above or below, I get 'dm_choices is not defined'

2 个答案:

答案 0 :(得分:0)

我知道了!感谢@synonym指出我的最后一个链接正确的方向。

您需要做的就是声明一个定义了类的函数。然后将变量传递给函数,并且可以在类中访问它。

最后,让函数返回表单对象。

示例:

def makeMyForm(myArray):
    def class MyForm(Form):
        my_select_field = SelectField(u'I'm a select field', choices=myArray)
        my_submit = SubmitField(u'Go!')
    return MyForm()

要制作表单,请使用:

form = makeMyForm(theArrayYouWant)

和Voilà!

注意:由于我之前遇到过这个问题,我会提到Array由元组组成:

myArray = [('value','What you see'),('value2','What you see again')]

答案 1 :(得分:0)

如果您想动态更改SelectField的选项,则以下内容应该有效:

class DataMappingForm(Form):

    def __init__(self, choices)
        self.DMpatient_id.choices = choices

    DMpatient_id = SelectField(u'Select Patient ID Column') #note that choices is absent

如果需要完全动态字段,可以在函数中动态创建类。来自WTForms Documentation

def my_view():
    class F(MyBaseForm):
        pass

    F.username = StringField('username')
    for name in iterate_some_model_dynamically():
        setattr(F, name, StringField(name.title()))

    form = F(request.POST, ...)
    # do view stuff

在这种情况下,您可以根据需要自定义表单。当然,在您只想自定义选项的情况下,第一种方法就足够了。