Python Flask Mega 教程 - jinja2.exceptions.UndefinedError: 'form' 未定义
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/19506109/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Flask Mega Tutorial - jinja2.exceptions.UndefinedError: 'form' is undefined
提问by asdoylejr
I am working through Miguel Grinberg's Flask Mega Tutorial and I cannot figure out why the index page now fails to load. Here is the traceback:
我正在阅读 Miguel Grinberg 的 Flask Mega 教程,但我无法弄清楚为什么索引页面现在无法加载。这是回溯:
File "/home/asdoylejr/microblog/flask/lib/python2.7/site-packages/flask/app.py", line 1836, in __call__
return self.wsgi_app(environ, start_response)
File "/home/asdoylejr/microblog/flask/lib/python2.7/site-packages/flask/app.py", line 1820, in wsgi_app
response = self.make_response(self.handle_exception(e))
File "/home/asdoylejr/microblog/flask/lib/python2.7/site-packages/flask/app.py", line 1403, in handle_exception
reraise(exc_type, exc_value, tb)
File "/home/asdoylejr/microblog/flask/lib/python2.7/site-packages/flask/app.py", line 1817, in wsgi_app
response = self.full_dispatch_request()
File "/home/asdoylejr/microblog/flask/lib/python2.7/site-packages/flask/app.py", line 1477, in full_dispatch_request
rv = self.handle_user_exception(e)
File "/home/asdoylejr/microblog/flask/lib/python2.7/site-packages/flask/app.py", line 1381, in handle_user_exception
reraise(exc_type, exc_value, tb)
File "/home/asdoylejr/microblog/flask/lib/python2.7/site-packages/flask/app.py", line 1475, in full_dispatch_request
rv = self.dispatch_request()
File "/home/asdoylejr/microblog/flask/lib/python2.7/site-packages/flask/app.py", line 1461, in dispatch_request
return self.view_functions[rule.endpoint](**req.view_args)
File "/home/asdoylejr/microblog/flask/lib/python2.7/site-packages/flask_login.py", line 658, in decorated_view
return func(*args, **kwargs)
File "/home/asdoylejr/microblog/app/views.py", line 44, in index
posts = posts)
File "/home/asdoylejr/microblog/flask/lib/python2.7/site-packages/flask/templating.py", line 128, in render_template
context, ctx.app)
File "/home/asdoylejr/microblog/flask/lib/python2.7/site-packages/flask/templating.py", line 110, in _render
rv = template.render(context)
File "/home/asdoylejr/microblog/flask/lib/python2.7/site-packages/jinja2/environment.py", line 969, in render
return self.environment.handle_exception(exc_info, True)
File "/home/asdoylejr/microblog/flask/lib/python2.7/site-packages/jinja2/environment.py", line 742, in handle_exception
reraise(exc_type, exc_value, tb)
File "/home/asdoylejr/microblog/app/templates/index.html", line 2, in top-level template code
{% extends "base.html" %}
File "/home/asdoylejr/microblog/app/templates/base.html", line 30, in top-level template code
{% block content %}{% endblock %}
File "/home/asdoylejr/microblog/app/templates/index.html", line 7, in block "content"
{{form.hidden_tag()}}
File "/home/asdoylejr/microblog/flask/lib/python2.7/site-packages/jinja2/environment.py", line 397, in getattr
return getattr(obj, attribute)
UndefinedError: 'form' is undefined
Here is the code for the index page in question:
以下是相关索引页的代码:
<!-- extend base layout -->
{% extends "base.html" %}
{% block content %}
<h1>Hi, {{g.user.nickname}}!</h1>
<form action="" method="post" name="post">
{{form.hidden_tag()}}
<table>
<tr>
<td>Say something:</td>
<td>{{form.post(size = 30, maxlength = 140)}}</td>
<td>
{% for error in form.errors.post %}
<span style="color: red;">[{{error}}]</span><br>
{% endfor %}
</td>
</tr>
<tr>
<td></td>
<td><input type="submit" value="Post!"></td>
<td></td>
</tr>
</table>
</form>
{% for post in posts %}
<p>
{{post.author.nickname}} says: <b>{{post.body}}</b>
</p>
{% endfor %}
{% endblock %}
And here is the code in the view:
这是视图中的代码:
@app.route('/', methods = ['GET', 'POST'])
@app.route('/index', methods = ['GET', 'POST'])
@login_required
def index():
form = PostForm()
if form.validate_on_submit():
post = Post(body = form.post.data, timestamp = datetime.utcnow(), author = g.user)
db.session.add(post)
db.session.commit()
flash('Your post is now live!')
return redirect(url_for('index'))
posts = g.user.followed_posts().all()
return render_template("index.html",
title = 'Home',
user = user,
posts = posts)
I've read through the tutorial multiple times, and compared my code to the source he releases at the end of each lesson, and I have no idea why it is not working. I'm not sure why it's having trouble passing form in this view when it does not return an error passing forms in another view.
我已经多次通读教程,并将我的代码与他在每节课结束时发布的源代码进行了比较,但我不知道为什么它不起作用。我不确定为什么当它在另一个视图中传递表单没有返回错误时,它在这个视图中传递表单时遇到问题。
Can anyone point me in the right direction?
任何人都可以指出我正确的方向吗?
回答by zero323
You should pass form
as the context variable. Try this:
您应该form
作为上下文变量传递。尝试这个:
@app.route('/', methods = ['GET', 'POST'])
@app.route('/index', methods = ['GET', 'POST'])
@login_required
def index():
form = PostForm()
if form.validate_on_submit():
post = Post(body = form.post.data, timestamp = datetime.utcnow(), author = g.user)
db.session.add(post)
db.session.commit()
flash('Your post is now live!')
return redirect(url_for('index'))
posts = g.user.followed_posts().all()
return render_template("index.html",
title = 'Home',
user = user,
posts = posts,
form = form)
回答by Mark Hildreth
The error message that you've received is explained in the stack trace. Specifically, here:
您收到的错误消息在堆栈跟踪中进行了解释。具体来说,这里:
File "/home/asdoylejr/microblog/app/templates/index.html", line 7, in block "content"
{{form.hidden_tag()}}
File "/home/asdoylejr/microblog/flask/lib/python2.7/site-packages/jinja2/environment.py", line 397, in getattr
return getattr(obj, attribute)
UndefinedError: 'form' is undefined
The error message is coming from Jinja, which is saying that form
is undefined. Your template tries to use form
...
错误消息来自 Jinja,表示form
未定义。您的模板尝试使用form
...
...
{% block content %}
<h1>Hi, {{g.user.nickname}}!</h1>
<form action="" method="post" name="post">
{{form.hidden_tag()}}
<table>
...
...but you've never passed it as part of your render_template method (you've only defined title
, user
and posts
)...
...但您从未将它作为 render_template 方法的一部分传递(您只定义了title
,user
和posts
)...
return render_template("index.html",
title = 'Home',
user = user,
posts = posts)
回答by Rohit Dalal
You didn't pass 'form' in your template.
您没有在模板中传递“表单”。
Because it's part of you html template.
因为它是你 html 模板的一部分。
return render_template("index.html",
title = 'Home',
user = user,
posts = posts,
form = form) # <<<-------------------- Here.