Проверка формы в другой колбе маршрута

#python #flask #flask-wtforms

#python #колба #flask-wtforms

Вопрос:

У меня есть wtform колбы. Я могу проверить форму на маршруте, где она создается. Но я хочу проверить это с другого маршрута. Есть ли какой-либо другой способ, с помощью которого я могу получить доступ к объекту формы с другого маршрута, не используя переменную сеанса?

form_class.py

 class Fruit ( Form):
    Fruit = SelectField ( choices = [ ( 0,"Select Fruit"), ( 1,'Apple'), (2,'Grape'), (3,'Orange') ], coerce = int, id="Fruit", validators = [Required()])  
  

views.py:

 @app.route('/fruit',  methods = ['GET', 'POST'])
def fruit():
    form = Fruit()
    if form.validate_on_submit():
       return render_template("output.html")
    return render_template("name.html", form = form)
  

name.html

 <form action="" method="POST">
      {{ form.hidden_tag() }}
      {{form.Fruit}}
      {{form.Fruit.errors}}
      <input type = "submit">
</form>
  

Приведенный выше код работает совершенно нормально. Но я хочу сделать что-то вроде приведенного ниже:

 @app.route('/fruit')
def fruit():
    form = Fruit()
    '''if form.validate_on_submit():
       return render_template("output.html")'''
    return render_template("name.html", form = form)

@app.route('/fruit_submit', methods = ['GET', 'POST'])
def fruit_submit():
    print request.form
    if form.validate_on_submit():
       return render_template("output.html")
  

При попытке выполнить приведенный выше код я получаю следующую ошибку.

 NameError: global name 'form' is not defined
  

Комментарии:

1. Каждый запрос уникален. Переменная, определенная как часть одной, не существует в другой. Кроме того, это не то, как работает scope в Python. Переменная, определенная в одной функции, недоступна внутри другой, не вложенной функции. Просто добавьте form = Fruit() в fruit_submit , и все будет готово.

2. form = Fruit() переопределить в fruit_submit ?? @dirn

3. Вы ничего не переопределяете. form не определено в fruit_submit . Вот что NameError значит . Если вы хотите использовать что-то с именем form внутри fruit_submit , вам нужно определить это.

Ответ №1:

Вы должны вызвать класс Fruit с помощью request.form

 @app.route('/fruit_submit', methods = ['GET', 'POST'])
def fruit_submit():
    print Fruit(request.form)
    if Fruit(request.form).validate_on_submit():
       return render_template("output.html")
  

Комментарии:

1. Так и должно быть Fruit(request.form).validate_on_submit() . Пожалуйста, отредактируйте его. Я приму ответ. Спасибо.