所以我有一个我正在制作的烧瓶应用程序,我需要一些变量访问帮助。
大多数情况下,当您在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
...
到目前为止我尝试过:
working outside of request context
错误__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'
答案 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
在这种情况下,您可以根据需要自定义表单。当然,在您只想自定义选项的情况下,第一种方法就足够了。