我是Flask新手,已经编程3周了。
我得到一个。 "jinja2.exceptions.UndefinedError: 'form' is undefined error",我不知道如何解决。
我的主程序app.py:这只是相关的部分。
@app.route("/form", methods=["GET", "POST"])
def forms():
global reverse_exchange_rate, exchange_rate
form = CurrencyForm
if request.method == 'GET':
return render_template("form.html")
和我的form.html。
{% extends "layouts/main.html" %}
{% from "formhelper.html" import render_field %}
{% block content %}
<form method="GET" action="/form">
<div style="text-align: center">
<h1>Currency Exchange</h1>
{{ form.csrf_token }}
{{ render_field(form.currency_1) }}
{{ render_field(form.currency_2) }}
{{ render_field(form.exchange_rate) }}
{{ render_field(form.submit) }}
</div>
</form>
{% endblock %}
我得到了这个错误。
File "c:\users\sport\documents\flask attempt 2\venv\lib\site-packages\flask\app.py", line 2464, in __call__
return self.wsgi_app(environ, start_response)
File "c:\users\sport\documents\flask attempt 2\venv\lib\site-packages\flask\app.py", line 2450, in wsgi_app
response = self.handle_exception(e)
File "c:\users\sport\documents\flask attempt 2\venv\lib\site-packages\flask\app.py", line 1867, in handle_exception
reraise(exc_type, exc_value, tb)
File "c:\users\sport\documents\flask attempt 2\venv\lib\site-packages\flask\_compat.py", line 39, in reraise
raise value
File "c:\users\sport\documents\flask attempt 2\venv\lib\site-packages\flask\app.py", line 2447, in wsgi_app
response = self.full_dispatch_request()
File "c:\users\sport\documents\flask attempt 2\venv\lib\site-packages\flask\app.py", line 1952, in full_dispatch_request
rv = self.handle_user_exception(e)
File "c:\users\sport\documents\flask attempt 2\venv\lib\site-packages\flask\app.py", line 1821, in handle_user_exception
reraise(exc_type, exc_value, tb)
File "c:\users\sport\documents\flask attempt 2\venv\lib\site-packages\flask\_compat.py", line 39, in reraise
raise value
File "c:\users\sport\documents\flask attempt 2\venv\lib\site-packages\flask\app.py", line 1950, in full_dispatch_request
rv = self.dispatch_request()
File "c:\users\sport\documents\flask attempt 2\venv\lib\site-packages\flask\app.py", line 1936, in dispatch_request
return self.view_functions[rule.endpoint](**req.view_args)
File "C:\Users\sport\Documents\Flask Attempt 2\app.py", line 21, in forms
return render_template("form.html")
File "c:\users\sport\documents\flask attempt 2\venv\lib\site-packages\flask\templating.py", line 140, in render_template
ctx.app,
File "c:\users\sport\documents\flask attempt 2\venv\lib\site-packages\flask\templating.py", line 120, in _render
rv = template.render(context)
File "c:\users\sport\documents\flask attempt 2\venv\lib\site-packages\jinja2\environment.py", line 1090, in render
self.environment.handle_exception()
File "c:\users\sport\documents\flask attempt 2\venv\lib\site-packages\jinja2\environment.py", line 832, in handle_exception
reraise(*rewrite_traceback_stack(source=source))
File "c:\users\sport\documents\flask attempt 2\venv\lib\site-packages\jinja2\_compat.py", line 28, in reraise
raise value.with_traceback(tb)
File "C:\Users\sport\Documents\Flask Attempt 2\templates\form.html", line 2, in top-level template code
{% from "formhelper.html" import render_field %}
File "C:\Users\sport\Documents\Flask Attempt 2\templates\layouts\main.html", line 26, in top-level template code
Open an interactive python shell in this frame{% block content %}{% endblock %}
File "C:\Users\sport\Documents\Flask Attempt 2\templates\form.html", line 9, in block "content"
{{ form.csrf_token }}
File "c:\users\sport\documents\flask attempt 2\venv\lib\site-packages\jinja2\environment.py", line 471, in getattr
return getattr(obj, attribute)
jinja2.exceptions.UndefinedError: 'form' is undefined
我试着把那段python代码删掉,一切都很顺利。但如果我把它放回去,就会出现这个错误。
我也试过把form.html改成form1.html,不过错误还是一样,说form未定义。我不知道我的问题出在哪里。
form.html在templates文件夹中,文件的结构是正确的。
任何帮助是感激的。请记住,我已经编码了大约3周。
正如你在堆栈跟踪的底部所看到的那样。UndefinedError
来自模板行 {{ form.csrf_token }}
,其中模板期待一个名为 form
但没有传给它这样的变量。在Flask中,处理这个问题的方法是通过明确地将模板需要的所有变量作为关键字参数传递到 render_template
功能,例如 render_template("form.html", form=form)
.
见 官方快速入门教程中的相关部分。 更多细节。