Как извлечь значения из полей WTForm в Python?

#python #flask #wtforms #flask-class-views

#python #flask #wtforms

Вопрос:

Я создал эту простую веб-страницу с помощью Flask.

введите описание изображения здесь

Вместо использования HTML-виджетов, таких как для формы, я использовал библиотеку Flask WTForm, которая позволяет вам писать виджеты формы из кода Python. Вот мой код на Python:

 from flask import Flask, render_template
from wtforms import Form,StringField, SubmitField
from flask.views import View, MethodView

app = Flask(__name__)

class SquareForm(Form):
    side = StringField('Side of the square')
    button = SubmitField("Calculate")


class HomePage(MethodView):

    def get(self):
        return render_template('index2.html', square_form=square_form)

    def post(self):
        square_area = square_form.side.data * 2
        return render_template('index2.html', square_form=square_form, result = square_area)

# Create a view function for HomePage class
home_page = HomePage.as_view('home_page')
app.add_url_rule('/', view_func=home_page)
app.add_url_rule('/result', view_func=home_page, methods=['POST'])
square_form = SquareForm()

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

И это мой index.html код:

 <form method="POST" action="/result">
    {{ square_form.side.label }}: {{ square_form.side() }}
    {{square_form.button()}}
    {{result}}
</form>
  

Я запускаю код и ввожу 5 в поле ввода HTML, но получаю сообщение об ошибке:

   File "/Users/folder/main.py", line 18, in post
    square_area = square_form.side.data * 2
TypeError: unsupported operand type(s) for *: 'NoneType' and 'int'
  

Очевидно, что ошибка типа возникает из-за square_form.side.data is None . Я ожидаю square_form.side.data '5' , что вместо этого. Как я могу этого добиться?

Ответ №1:

Оказывается, форму нужно было инициализировать внутри метода post с request.form аргументом:

 from flask import request
def post(self):
    square_form = SquareForm(request.form)
    square_area = square_form.side.data * 2
    return render_template('index2.html', square_form=square_form, result = square_area)