Python 2.7 将前一个表单中定义的变量传递给另一个表单
所以我有一个烧瓶应用程序,我正在制作,我需要一些关于变量访问的帮助 大多数情况下,当您在flask中定义表单时,您将执行以下操作: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(下拉列表)中选择取决于以前表单的答案,您需要能够为新
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