python - jinja2.exceptions.UndefinedError: 'form' is undefined error in python, Flask
问题描述
我是 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.html 位于模板文件夹中,文件结构正确。
任何帮助表示赞赏。请记住,我已经编码了大约 3 周。
解决方案
正如您在堆栈跟踪的底部看到的那样,UndefinedError
来自模板行{{ form.csrf_token }}
,模板需要一个名为的变量form
,但没有将此类变量传递给它。在 Flask 中解决这个问题的方法是显式传递模板需要的所有变量作为函数中的关键字参数render_template
,例如render_template("form.html", form=form)
.
有关详细信息,请参阅官方快速入门教程的相关部分。
推荐阅读
- python - 用python合并iqy文件
- mysql - 创建 SUM 表的触发器并插入另一个表
- c# - XmlWriter 不会正确生成我需要的命名空间
- python - SQL Alchemy:嵌套复合列类型和自定义类型
- java - How to determine if Couchbase Server version supports the Extended Attributes (xattrs) feature?
- internationalization - Bahasa / 印度尼西亚和他加禄语 / 菲律宾的语言环境是什么?是 id_ID 和 tl_PH 吗?
- swift - 具有 r32Float 像素格式的 MTLTexture 到位图
- c++ - Setting negative elements Eigen SparseVector C++
- javascript - Chrome Extension: chrome.tabs.executeScript result from file
- azure-active-directory - Understanding scoping issues using ClaimsTransformation and DI for access to dbContext