首页 > 解决方案 > 如何将 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') }}" 都没有想要的结果

目标是让表单打印自己的数据并打印它来自哪个表单。目前,第一种形式打印两次相同的数据,第二种形式不打印任何内容。

标签: pythonsessionflaskflask-wtforms

解决方案


你可以做几件事: 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')

这应该适合你。


推荐阅读