Python 2.7 将前一个表单中定义的变量传递给另一个表单

Python 2.7 将前一个表单中定义的变量传递给另一个表单,python-2.7,flask,flask-wtforms,Python 2.7,Flask,Flask Wtforms,所以我有一个烧瓶应用程序,我正在制作,我需要一些关于变量访问的帮助 大多数情况下,当您在flask中定义表单时,您将执行以下操作: class MyForm(Form): my_field = StringField('I'm a field') my_submit = SubmitField('Go!') 当需要表单时,您将使用form=MyForm() 然而,到目前为止,一切都很好: 如果您想在一个SelectField(下拉列表)中选择取决于以前表单的答案,您需要能够为新

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

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

class MyForm(Form):
    my_field = StringField('I'm a field')
    my_submit = SubmitField('Go!')
当需要表单时,您将使用
form=MyForm()

然而,到目前为止,一切都很好:

如果您想在一个
SelectField
(下拉列表)中选择取决于以前表单的答案,您需要能够为新表单提供这些选择。这就是我想要实现的,但是我无法得到一个变量来保存它的内容

这是我的表单代码(页面代码上方):

这是我的页面代码:

@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
    ...
到目前为止,我所尝试的:

  • 会话['dm_choices']给了我一个在请求上下文之外工作的
    错误

  • 全局变量,由于某种原因重置
  • 通过添加数组来重载表单的
    \uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
我应该提到,这一切都需要在同一页上

是否有方法将此
数组的\u选项
传递给我的
数据映射表单

编辑这是我编辑
\uuuuu init\uuuu
重载时的样子:

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'

我明白了!感谢@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)

注意:正如我之前遇到的问题一样,我将提到
数组
由元组组成:

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

如果要动态更改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
如果需要完全动态的字段,可以在函数中动态创建类。从:


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

那么您需要表单是动态的,而不需要重新加载页面?Flask只处理服务器端代码,对于客户端动态,您需要javascript。不,我已经在使用页面重新加载了,我的意思是,一旦您引用了第一个表单,第二个表单就会出现在同一个页面上(重新加载后),然后使用会话和重载
\uuu init\uu
的方法应该可以工作。你能给出具体的代码吗?是一些关于动态表单的文档。“全局变量,出于某种原因重置”原因是每个请求都是唯一的,可以由单独的进程/线程处理。如果在处理我的请求过程中设置的值影响了其他人的后续请求,那就太糟糕了。可能是重复的哦,就是这样!我缺少的部分是self.DMpatient\u id.choices=choices
。谢谢你的帮助。顺便说一句,我刚才发布的方式也有效。使用它有什么问题吗?我认为只要它有效,你的方式就是好的。“通常”不会动态创建类,也许这就是为什么在这种情况下,他们会添加一个修改选项的可能性。好吧,我会记住这一点。谢谢你的帮助!
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
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