flask-bootstrap 一页有两种形式
flask-bootstrap with two forms in one page
我打算在我的 flask 应用程序的一个页面中放置两个表单,一个用于编辑一般用户信息,另一个用于重置密码。模板看起来像这样
{% extends "base.html" %}
{% import "bootstrap/wtf.html" as wtf %}
{% block page_content %}
<div class="page-header">
<h1>Edit Profile</h1>
</div>
{{ wtf.quick_form(form_profile, form_type='horizontal') }}
<hr>
{{ wtf.quick_form(form_reset, form_type='horizontal') }}
<hr>
{% endblock %}
每个表单都有一个提交按钮。
在route函数中,我试过这样把两个form分开
form_profile = ProfileForm()
form_reset = ResetForm()
if form_profile.validate_on_submit() and form_profile.submit.data:
....
if form_reset.validate_on_submit() and form_reset.submit.data:
.....
但是没有用。当我单击 ResetForm 中的按钮时,将执行 ProfileForm 验证逻辑。
我怀疑问题是 wtf.quick_form()
创建了两个相同的提交按钮,但不确定。
遇到这种情况怎么办? bootstrap/wtf.html
模板可以处理这种情况吗?
用不同的名称定义这两个 SubmitField,如下所示:
class Form1(Form):
name = StringField('name')
submit1 = SubmitField('submit')
class Form2(Form):
name = StringField('name')
submit2 = SubmitField('submit')
然后在 view.py
:
....
form1 = Form1()
form2 = Form2()
if form1.submit1.data and form1.validate_on_submit(): # notice the order
....
if form2.submit2.data and form2.validate_on_submit(): # notice the order
....
至此问题解决
如果您想深入了解,请继续阅读。
这里是validate_on_submit()
:
def validate_on_submit(self):
"""
Checks if form has been submitted and if so runs validate. This is
a shortcut, equivalent to ``form.is_submitted() and form.validate()``
"""
return self.is_submitted() and self.validate()
这里是 is_submitted()
:
def is_submitted(self):
"""
Checks if form has been submitted. The default case is if the HTTP
method is **PUT** or **POST**.
"""
return request and request.method in ("PUT", "POST")
当您调用 form.validate_on_submit()
时,无论单击哪个提交按钮,它都会检查表单是否已通过 HTTP 方法提交。所以上面的小技巧就是添加一个过滤器(检查提交是否有数据,即form1.submit1.data
)。
此外,我们改变了 if 的顺序,所以当我们点击一个提交时,它只调用 validate() 到这个表单,防止两个表单的验证错误。
故事还没有结束。这里是 .data
:
@property
def data(self):
return dict((name, f.data) for name, f in iteritems(self._fields))
它return一个带有字段名(键)和字段数据(值)的字典,但是,我们的两个表单提交按钮具有相同的名称submit
(键)!
当我们点击第一个提交按钮(在 form1 中)时,来自 form1.submit1.data
return 的调用是这样的:
temp = {'submit': True}
毫无疑问,当我们调用if form1.submit.data:
时,它return True
.
当我们点击第二个提交按钮(在 form2 中)时,在 if form1.submit.data:
中调用 .data
在 dict first 中添加一个键值,然后来自 if form2.submit.data:
的调用添加另一个键值,最后,dict 将像这样:
temp = {'submit': False, 'submit': True}
现在我们调用if form1.submit.data:
,它return True
,即使我们点击的提交按钮是在form2中。
这就是为什么我们需要用不同的名称来定义这两个 SubmitField
。顺便说一下,感谢阅读(到这里)!
感谢 nos 的通知,他添加了一个关于 validate()
的问题,查看下面的评论!
我打算在我的 flask 应用程序的一个页面中放置两个表单,一个用于编辑一般用户信息,另一个用于重置密码。模板看起来像这样
{% extends "base.html" %}
{% import "bootstrap/wtf.html" as wtf %}
{% block page_content %}
<div class="page-header">
<h1>Edit Profile</h1>
</div>
{{ wtf.quick_form(form_profile, form_type='horizontal') }}
<hr>
{{ wtf.quick_form(form_reset, form_type='horizontal') }}
<hr>
{% endblock %}
每个表单都有一个提交按钮。
在route函数中,我试过这样把两个form分开
form_profile = ProfileForm()
form_reset = ResetForm()
if form_profile.validate_on_submit() and form_profile.submit.data:
....
if form_reset.validate_on_submit() and form_reset.submit.data:
.....
但是没有用。当我单击 ResetForm 中的按钮时,将执行 ProfileForm 验证逻辑。
我怀疑问题是 wtf.quick_form()
创建了两个相同的提交按钮,但不确定。
遇到这种情况怎么办? bootstrap/wtf.html
模板可以处理这种情况吗?
用不同的名称定义这两个 SubmitField,如下所示:
class Form1(Form):
name = StringField('name')
submit1 = SubmitField('submit')
class Form2(Form):
name = StringField('name')
submit2 = SubmitField('submit')
然后在 view.py
:
....
form1 = Form1()
form2 = Form2()
if form1.submit1.data and form1.validate_on_submit(): # notice the order
....
if form2.submit2.data and form2.validate_on_submit(): # notice the order
....
至此问题解决
如果您想深入了解,请继续阅读。
这里是validate_on_submit()
:
def validate_on_submit(self):
"""
Checks if form has been submitted and if so runs validate. This is
a shortcut, equivalent to ``form.is_submitted() and form.validate()``
"""
return self.is_submitted() and self.validate()
这里是 is_submitted()
:
def is_submitted(self):
"""
Checks if form has been submitted. The default case is if the HTTP
method is **PUT** or **POST**.
"""
return request and request.method in ("PUT", "POST")
当您调用 form.validate_on_submit()
时,无论单击哪个提交按钮,它都会检查表单是否已通过 HTTP 方法提交。所以上面的小技巧就是添加一个过滤器(检查提交是否有数据,即form1.submit1.data
)。
此外,我们改变了 if 的顺序,所以当我们点击一个提交时,它只调用 validate() 到这个表单,防止两个表单的验证错误。
故事还没有结束。这里是 .data
:
@property
def data(self):
return dict((name, f.data) for name, f in iteritems(self._fields))
它return一个带有字段名(键)和字段数据(值)的字典,但是,我们的两个表单提交按钮具有相同的名称submit
(键)!
当我们点击第一个提交按钮(在 form1 中)时,来自 form1.submit1.data
return 的调用是这样的:
temp = {'submit': True}
毫无疑问,当我们调用if form1.submit.data:
时,它return True
.
当我们点击第二个提交按钮(在 form2 中)时,在 if form1.submit.data:
中调用 .data
在 dict first 中添加一个键值,然后来自 if form2.submit.data:
的调用添加另一个键值,最后,dict 将像这样:
temp = {'submit': False, 'submit': True}
现在我们调用if form1.submit.data:
,它return True
,即使我们点击的提交按钮是在form2中。
这就是为什么我们需要用不同的名称来定义这两个 SubmitField
。顺便说一下,感谢阅读(到这里)!
感谢 nos 的通知,他添加了一个关于 validate()
的问题,查看下面的评论!