【发布时间】:2016-07-05 13:34:31
【问题描述】:
所以我正在制作这个烧瓶应用程序,我需要一些有关变量访问的帮助。
大多数时候,当您在烧瓶中定义表单时,您会执行以下操作:
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'
【问题讨论】:
-
所以您需要动态表单而不需要重新加载页面? Flask 仅处理服务器端代码,对于客户端动态,您需要 javascript。
-
不,我正在使用页面重新加载,我的意思是,一旦您引用了第一个表单,第二个表单就会出现在同一页面上(重新加载后)
-
那么会话和重载
__init__的方法应该可以工作。能给出具体代码吗? Here 是一些关于动态表单的文档。 -
"全局变量,由于某种原因被重置" 原因是每个请求都是唯一的,可以由单独的进程/线程处理。如果在处理我的请求过程中设置的值影响了其他人的后续请求,那将是非常糟糕的。
标签: python-2.7 flask flask-wtforms