python – flask-bootstrap在一个页面中有两个表单
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了python – flask-bootstrap在一个页面中有两个表单,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2945字,纯文字阅读大概需要5分钟。
内容图文
![python – flask-bootstrap在一个页面中有两个表单](/upload/InfoBanner/zyjiaocheng/699/0d7d1d8b1e7043b888d079f40680ec5a.jpg)
我打算在我的烧瓶应用程序中将两个表单放在一个页面中,一个用于编辑一般用户信息,另一个用于重置密码.模板看起来像这样
{% 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 %}
每个表单都有一个提交按钮.
在路由功能中,我试图将这两个表单分开
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))
它返回带有字段名称(键)和字段数据(值)的字典,但是,我们的两个表单提交按钮具有相同的名称提交(键)!
当我们单击第一个提交按钮(在form1中)时,来自form1.submit1.data的调用返回一个这样的dict:
temp = {'submit': True}
毫无疑问,当我们调用form1.submit.data:时,它返回True.
当我们单击第二个提交按钮(在form2中)时,如果form1.submit.data调用.data:首先在dict中添加一个键值,然后从if form2.submit.data调用:添加另一个键值最后,dict会这样:
temp = {'submit': False, 'submit': True}
现在我们调用form1.submit.data:,它返回True,即使我们点击的提交按钮是form2.
这就是为什么我们需要用不同的名称定义这两个SubmitField.顺便说一句,感谢阅读(到这里)!
感谢nos的通知,他添加了一个关于validate()的问题,请查看下面的评论!
内容总结
以上是互联网集市为您收集整理的python – flask-bootstrap在一个页面中有两个表单全部内容,希望文章能够帮你解决python – flask-bootstrap在一个页面中有两个表单所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。