python - 如何将 2 个工作表单添加到同一个模板?
问题描述
我需要将 2 个单独的表单添加到同一个网页,我无法让第二个表单输出任何信息。
在我的研究中,我看到有人建议将表单拆分为 2 个不同的 def 函数,但我无法弄清楚如何做到这一点,以使两种表单在理智的时候都可以使用。
from flask import Flask, session, render_template, url_for, redirect
from flask_wtf import FlaskForm
from wtforms import StringField, SubmitField
app = Flask(__name__)
app.config['SECRET_KEY'] = 'b317a06ad972917a84be4c6c14c64882'
class PostForm(FlaskForm):
content = StringField('Content')
submit = SubmitField('Submit')
class SecondPostForm(FlaskForm):
content = StringField('Second Content')
submit = SubmitField('Second Submit')
@app.route("/", methods=['GET', 'POST'])
@app.route("/home", methods=['GET', 'POST'])
def home():
form = PostForm()
second_form = SecondPostForm()
if form.validate_on_submit():
print(form.content.data)
session['content'] = form.content.data
redirect(url_for('submit'))
return redirect(url_for('submit'))
'''
--------------------------------------------------------------------
is it possible to split the second if statement onto its own def and keep
them both usable on the same page at the same time?
--------------------------------------------------------------------
'''
elif second_form.validate_on_submit():
print(second_form.content.data)
session['content'] = second_form.content.data
return redirect(url_for('othersubmit'))
return render_template('example.html', second_form=second_form, form=form)
@app.route("/submit", methods=['GET', 'POST'])
def submit():
content = session.get('content', None)
print(content)
session.pop('content', None)
return redirect(url_for('home'))
@app.route("/othersubmit", methods=['GET', 'POST'])
def othersubmit():
print('othersubmit')
content = session.get('content', None)
print(content)
session.pop('content', None)
return redirect(url_for('home'))
if __name__ == "__main__":
app.run(debug=True)
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<div class="content-section">
<form method="POST" action="">
{{ form.hidden_tag() }}
<fieldset class="form-group">
<legend class="border-bottom mb-4">{{ legend }}</legend>
<div class="form-group">
{{ form.content.label(class="form-control-label") }}
{% if form.content.errors %}
{{ form.content(class="form-control form-control-lg is-invalid") }}
<div class="invalid-feedback">
{% for error in form.content.errors %}
<span>{{ error }}</span>
{% endfor %}
</div>
{% else %}
{{ form.content(class="form-control form-control-lg") }}
{% endif %}
</div>
</fieldset>
<div class="form-group">
{{ form.submit(class="btn btn-outline-info") }}
</div>
</form>
<form method="POST" action="{{ url_for('othersubmit') }}">
{{ second_form.hidden_tag() }}
<fieldset class="form-group">
<legend class="border-bottom mb-4">{{ legend }}</legend>
<div class="form-group">
{{ second_form.content.label(class="form-control-label") }}
{% if second_form.content.errors %}
{{ second_form.content(class="form-control form-control-lg is-invalid") }}
<div class="invalid-feedback">
{% for error in second_form.content.errors %}
<span>{{ error }}</span>
{% endfor %}
</div>
{% else %}
{{ second_form.content(class="form-control form-control-lg") }}
{% endif %}
</div>
</fieldset>
<div class="form-group">
{{ second_form.submit(class="btn btn-outline-info") }}
</div>
</form>
</div>
</body>
</html>
我试过有无 action="{{ url_for('othersubmit') }}" 都没有想要的结果
目标是让表单打印自己的数据并打印它来自哪个表单。目前,第一种形式打印两次相同的数据,第二种形式不打印任何内容。
解决方案
你可以做几件事: 1)首先,如果你在一页上有 2 个表单,你不能有两个 {{ second_form.hidden_tag() }},因为它们会抛出具有相同 id 的错误。根据 wtform 文档,我将其处理为 {{ form.csrf_token(id='login_csrf') }}。看到你可以指定你自己的 id,这样可以防止冲突。
2) 更改两种表单中的提交按钮名称。使它们与众不同。然后你可以做如下。如您所见,我在同一页面 form_login 和 form_reg 上有 2 个表单。我一直在提交按钮名称不同。一个是登录,另一个是注册。
if form_login.login.data:
if form_login.validate_on_submit():
#do something here
elif form_reg.register.data:
if form_reg.validate_on_submit():
#do something here
return render_template('abc.html')
这应该适合你。
推荐阅读
- python - argparse 输入执行不应该执行的命令
- sql - 如何使用 SQL Server 的外键有效且安全地将记录插入数据库?
- perl - 以等宽字体计算字符串的宽度
- ios - 无法从 AppDelegate 发布通知
- c++ - 如何选择总和为目标数字的数字序列(从固定列表中)?
- c# - Unity检查器中如何区分不同的BoxCollider
- hibernate - 我们如何在 Hibernate >=5.2 中使用 CriteriaQuery 计算行数,替换不推荐使用的代码?
- php - 如何在帖子和评论系统中使用 JQuery 最接近()
- python - 不明白为什么我不断收到有关不受支持的操作数类型的 TypeError
- sql - 数据库澄清问题