多重形式加上Flask一直说我没有定义形式

2024-04-26 23:53:13 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图用验证器在同一个烧瓶页面上设置两个不同的表单,但它总是告诉我我的表单没有定义。我得到错误:

该代码的设计允许用户输入一个数字,并检查它是否充足、完美或不足,然后用一个单独的表单允许用户定义一个范围,并得到该范围内有多少个富足、完美或不足的数字。在

我的代码如下:

from flask import Flask, render_template, request
from flask_wtf import Form
from wtforms import IntegerField
from wtforms.validators import InputRequired
from perfect_numbers import classify, listInRange

app = Flask(__name__)
app.config['SECRET_KEY'] = 'DontTellAnyone'

class PerfectForm(Form):
    inputNumber = IntegerField('input a number', default=1, validators=[InputRequired(message='Please input an integer')])

class PerfectRangeForm(Form):
    startNumber = IntegerField('input a number', default=1, validators=[InputRequired(message='Please input an integer')])
    endNumber = IntegerField('input a number', default=1, validators=[InputRequired(message='Please input an integer')])

@app.route('/', methods=['GET', 'POST'])
def index():
    form1 = PerfectForm(request.form, prefix="form1")
    num = 1
    Classify = classify(num)
    if form.validate_on_submit() and form.data:
        num = request.form1['inputNumber']
        Classify = classify(form1.inputNumber.data)
        return render_template('index.html', form1=form1, num=num, classify=Classify)
    return render_template('index.html', num=1, form1=form1, classify=Classify)

@app.route('/aliRange', methods=['GET', 'POST'])
def aliRange():
    form2 = PerfectRangeForm(request.form2, prefix="form2")
    startNumber = 1
    endNumber = 1
    aliquot = 'abundant'
    Classify = classify(num)
    ListInRange = listInRange(startNumber, endNumber, aliquot)
    if form2.validate_on_submit() and form2.data:
        startNumber = request.form2['startNumber']
        endNumber = request.form2['endNumber']
        aliquot = request.form2['aliquot']
        ListInRange = listInRange(startNumber, endNumber, aliquot)
        return render_template('index.html', form2=form2, startNumber=startNumber, endNumber=endNumber, ListInRange=listInRange)
    return render_template('index.html', form2=form2, startNumber=startNumber, endNumber=endNumber, ListInRange=listInRange)

if __name__ == '__main__':
    app.run(debug=True)

在索引.html公司名称:

^{pr2}$

获取atm的错误是:AttributeError:“Request”对象没有属性“form1”


Tags: fromimportappinputindexrequesttemplaterender
1条回答
网友
1楼 · 发布于 2024-04-26 23:53:13

编辑:

您可以使用单个视图简化代码,使用submit值来区分第一个表单和第二个表单的处理。在

修改后的代码为:

class PerfectForm(Form):
    inputNumber = IntegerField('input a number', default=1, validators=[InputRequired(message='Please input an integer')])

class PerfectRangeForm(Form):
    startNumber = IntegerField('input a number', default=1, validators=[InputRequired(message='Please input an integer')])
    endNumber = IntegerField('input a number', default=1, validators=[InputRequired(message='Please input an integer')])
    aliquot = StringField('input a kind', default='perfect')

@app.route('/', methods=['GET', 'POST'])
def index():
    form1 = PerfectForm(request.form, prefix="form1")
    form2 = PerfectRangeForm(request.form, prefix="form2")

    num = 1
    Classify = classify(num)

    startNumber = 1
    endNumber = 1
    aliquot = 'abundant'
    ListInRange = listInRange(startNumber, endNumber, aliquot)

    if request.form.get('submit') == 'submit-1':
        if form1.validate_on_submit() and form1.data:
            num = form1.data['inputNumber']
            Classify = classify(num)
    elif request.form.get('submit') == 'submit-2':
        if form2.validate_on_submit() and form2.data:
            startNumber = form2.data['startNumber']
            endNumber = form2.data['endNumber']
            aliquot = form2.data['aliquot']
            ListInRange = listInRange(startNumber, endNumber, aliquot)
    return render_template('index.html',
        num=num, classify=Classify,
        startNumber=startNumber, endNumber=endNumber, aliquot=aliquot, ListInRange=ListInRange,
        form1=form1, form2=form2)

if __name__ == '__main__':
    app.run(debug=True)

修改后的模板index.html是:

^{pr2}$

旧版:

您在模板中使用form1,但在模板上下文中传递form

render_template('index.html', form=form1, num=num, classify=Classify)

您可以在模板内将form1更改为form,也可以在上面的行中传递form1=form1。在

如果在同一模板中呈现多个表单,则必须传递所有相应的表单变量:form1form2。。。从渲染该模板的所有视图。否则,模板呈现将引发您看到的错误。在

如果您对在模板内所有可能的表单中呈现一个表单感兴趣,可以使用

{% if form1 %}
<div>
  <form action="/" method="POST">
    <dl>
      {{ form1.csrf_token }}
      ...
    </dl>
  </form>
</div>
{% endif %}

{% if form2 %}
<form action="/aliRange" method="POST">
...
</form>
{% endif %}

...

另外,你的html在我看来是不正确的,因为你有一个表单嵌套在另一个表单中。不知道你想在那里得到什么。在

相关问题 更多 >