用不同的名称定义这两个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方法提交。因此,上面的小技巧只是添加一个过滤器(以检查Submit是否具有数据,即
form1.submit1.data)。
此外,我们更改了if的顺序,因此,当我们单击一个提交时, 它仅将此表单调用validate() ,从而防止了两种表单的验证错误。
故事还没有结束。这里是
.data:
@propertydef data(self): return dict((name, f.data) for name, f in iteritems(self._fields))
它返回一个具有字段名(键)和字段数据(值)的字典,但是, 我们的两个表单提交按钮具有相同的名称submit
(键)!
当我们单击第一个提交按钮(在form1中)时,来自的调用将
form1.submit1.data返回一个类似这样的字典:
temp = {'submit': True}毫无疑问,当我们打电话时
if form1.submit.data:,它会返回
True。
当我们单击第二个提交按钮(在form2中)时,对
.datain的调用 首先*
ifform1.submit.data:在dict中添加键值,然后从中调用添加另一个键值,最后,该dict将如下所示: *
ifform2.submit.data:
temp = {'submit': False, 'submit': True}现在我们调用
if form1.submit.data:,
True即使我们单击的提交按钮位于form2中,它也会返回。
这就是为什么我们需要
SubmitField使用不同的名称来定义这两个。顺便说一句,感谢您的阅读(到这里)!
感谢您的通知,他添加了一个有关的问题
validate(),请检查以下评论!



