Google app engine 测试Jinja2中是否存在表单实例
我将WTforms与Jinja2一起使用,希望根据是否创建编辑现有表单对象的新实例来更改模板页面标题 这是我在模板中写的:Google app engine 测试Jinja2中是否存在表单实例,google-app-engine,jinja2,wtforms,Google App Engine,Jinja2,Wtforms,我将WTforms与Jinja2一起使用,希望根据是否创建编辑现有表单对象的新实例来更改模板页面标题 这是我在模板中写的: {% block title %}{% if form.obj %}Edit{% else %}New{% endif %} Post{% endblock %} 我期望看到的是: 如果填写了表格,我希望在页面标题中看到“编辑帖子” 如果表单为空,我希望在页面标题中看到“newpost” 我得到的是:两种情况下的“新帖子” 这是我传递表单值的PostHandler def
{% block title %}{% if form.obj %}Edit{% else %}New{% endif %} Post{% endblock %}
我期望看到的是:
如果填写了表格,我希望在页面标题中看到“编辑帖子”
如果表单为空,我希望在页面标题中看到“newpost”
我得到的是:两种情况下的“新帖子”
这是我传递表单值的PostHandler
def with_post(fun):
def decorate(self, post_id=None):
post = None
if post_id:
post = models.BlogPost.get_by_id(int(post_id))
if not post:
self.error(404)
return
fun(self, post)
return decorate
class PostHandler(BaseHandler):
def render_form(self, form):
self.render_to_response("edit.html", {'form': form})
@with_post
def get(self, post):
self.render_form(MyForm(obj=post))
@with_post
def post(self, post):
form = MyForm(formdata=self.request.POST, obj=post)
if post and form.validate():
form.populate_obj(post)
post.put()
post.publish()
self.render_to_response("published.html", {'post': post})
elif self.request.POST and form.validate():
post = models.BlogPost()
post.title = form.title.data
post.body = form.body.data
post.tags = form.tags.data
post.publish()
self.render_to_response("published.html", {'post': post})
else:
self.render_to_response('edit.html', {'form':form})
简而言之,我所要做的就是测试表单是否已填写,并相应地更改我的页面标题“New Post”或“Edit Post” 虽然表单接受一个obj参数,但它实际上并没有存储它,它只是使用该obj来填充formdata未提供的任何空白。因此,当您询问Jinja2
{%if form.obj%}
时,它总是会为False,因为从来没有obj属性(当然,除非您有一个恰好被称为obj的字段)
如果你正在编辑一篇文章,你将有一个id来使用,这样你就知道要在数据库中更新哪篇文章,那么你当前将它存储在哪里?假设将其存储为隐藏字段,则可以执行以下操作:
{% if form.id.data == None %}Must be a New form {% endif %}
如果要检查整个表单是否为空,可以访问表单.data
字典,并确保所有条目都是None
,不过需要小心,因为我知道FileField返回的是u'None'
,而不是真正的None
,因此,您必须再次检查您关心的字段