Передача переменной в шаблон в Flask / WTF дает 500 ошибок, форма не определена - PullRequest
0 голосов
/ 07 апреля 2019

Я пытался передать переменную из формы WTForms в шаблон, но она отбрасывает на меня 500 ошибок. Я в основном пытаюсь отобразить пользовательский ввод из предыдущей формы на странице результатов.

Однако все решения, которые я нашел, говорят, что мне нужно объявить форму = форма, как я уже это сделал. Это файл results.html, сообщающий об ошибке, но я не уверен, почему форма не определена.

UndefinedError: 'form' is undefined

-bot.py

from flask import Flask, render_template, flash, redirect, url_for
from config import Config
from forms import LoginForm
from flask_bootstrap import Bootstrap
from tweetscript import get_tweets

app = Flask(__name__)
app.config.from_object(Config)
bootstrap = Bootstrap(app)

@app.route('/', methods=['GET', 'POST'])
def login():
    form = LoginForm()
    if form.validate_on_submit():
        flash('Twitter name submitted {}'.format(form.username.data))
            return redirect(url_for('results'))
    return render_template('login.html', title='Home', form=form)

@app.route("/results")
def results():
    return render_template('results.html', title='Results')


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

-results.html

{% extends 'index.html' %}

{% block content %}
    <h1> results page, {{ form.username.data }}
     </h1>
{% endblock %}

-traceback

    Traceback (most recent call last):
  File "/home/pi/bot/project/venv/local/lib/python2.7/site-packages/flask/app.py", line 2292, in wsgi_app
    response = self.full_dispatch_request()
  File "/home/pi/bot/project/venv/local/lib/python2.7/site-packages/flask/app.py", line 1815, in full_dispatch_request
    rv = self.handle_user_exception(e)
  File "/home/pi/bot/project/venv/local/lib/python2.7/site-packages/flask/app.py", line 1718, in handle_user_exception
    reraise(exc_type, exc_value, tb)
  File "/home/pi/bot/project/venv/local/lib/python2.7/site-packages/flask/app.py", line 1813, in full_dispatch_request
    rv = self.dispatch_request()
  File "/home/pi/bot/project/venv/local/lib/python2.7/site-packages/flask/app.py", line 1799, in dispatch_request
    return self.view_functions[rule.endpoint](**req.view_args)
  File "./bot.py", line 21, in results
    return render_template('results.html', title='Results')
  File "/home/pi/bot/project/venv/local/lib/python2.7/site-packages/flask/templating.py", line 135, in render_template
    context, ctx.app)
  File "/home/pi/bot/project/venv/local/lib/python2.7/site-packages/flask/templating.py", line 117, in _render
    rv = template.render(context)
  File "/home/pi/bot/project/venv/local/lib/python2.7/site-packages/jinja2/environment.py", line 1008, in render
    return self.environment.handle_exception(exc_info, True)
  File "/home/pi/bot/project/venv/local/lib/python2.7/site-packages/jinja2/environment.py", line 780, in handle_exception
    reraise(exc_type, exc_value, tb)
  File "/home/pi/bot/project/templates/results.html", line 1, in top-level template code
    {% extends 'index.html' %}
  File "/home/pi/bot/project/templates/index.html", line 1, in top-level template code
    {% extends "base.html" %}
  File "/home/pi/bot/project/templates/base.html", line 40, in top-level template code
    {% for message in messages %}
  File "/home/pi/bot/project/venv/local/lib/python2.7/site-packages/flask_bootstrap/templates/bootstrap/base.html", line 1, in top-level template code
    {% block doc -%}
  File "/home/pi/bot/project/venv/local/lib/python2.7/site-packages/flask_bootstrap/templates/bootstrap/base.html", line 4, in block "doc"
    {%- block html %}
  File "/home/pi/bot/project/venv/local/lib/python2.7/site-packages/flask_bootstrap/templates/bootstrap/base.html", line 20, in block "html"
    {% block body -%}
  File "/home/pi/bot/project/venv/local/lib/python2.7/site-packages/flask_bootstrap/templates/bootstrap/base.html", line 23, in block "body"
    {% block content -%}
  File "/home/pi/bot/project/templates/results.html", line 6, in block "content"
    {{ form.username.data }}
  File "/home/pi/bot/project/venv/local/lib/python2.7/site-packages/jinja2/environment.py", line 430, in getattr
    return getattr(obj, attribute)
UndefinedError: 'form' is undefined

1 Ответ

0 голосов
/ 07 апреля 2019

Ошибка возникает из-за того, что ваша функция results возвращает только две вещи: страницу results.html и ее title ;но на вашей странице results.html вы пытаетесь восстановить данные, которые не определены в функции, но получены из другой функции ( login ).

Одним из возможных решений будет:

...
@app.route('/', methods=['GET', 'POST'])
def login():
    form = LoginForm()
    if form.validate_on_submit():
        flash('Twitter name submitted {}'.format(form.username.data))
            return redirect(url_for('results', result_data = form.username.data))
    return render_template('login.html', title='Home', form=form)

@app.route("/results/<result_data>")
def results(result_data=None):
    return render_template('results.html', title='Results', result=result_data)
...

И на вашей results.html странице:

{% extends 'index.html' %}

{% block content %}
    <h1> results page, {{ result }} </h1>
{% endblock %}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...