0

我正在将 WTforms 与 Jinja2 一起使用,并希望根据我是否正在创建编辑现有表单对象的新实例来更改我的模板页面标题。

这是我在模板中写的:

{% block title %}{% if form.obj %}Edit{% else %}New{% endif %} Post{% endblock %}

我期望看到的:

如果表格已填写,我希望在页面标题中看到“编辑帖子”。

如果表单为空,我希望在页面标题中看到“新帖子”。

我得到的是:在这两种情况下都是“新帖子”。

这是传递表单值的我的 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})

简而言之,我要做的就是测试表格是否填写,并相应地更改我的页面标题“新帖子”或“编辑帖子”。

4

1 回答 1

1

虽然 Form 接受 obj 参数,但它实际上并不存储它,它只是使用该 obj 来填充 formdata 未提供的任何空白。因此,当您询问 Jinja2 时{% if form.obj %},它总是会为 False,因为从来没有 obj 属性(除非您有一个恰好被称为 obj 的字段)。

如果您正在编辑帖子,您将有一个 id 可以使用,因此您知道要在数据库中更新哪个帖子,那么您当前将其存储在哪里?假设您将其存储为隐藏字段,您可以这样做:

{% if form.id.data == None %}Must be a New form {% endif %}

如果您想检查整个表单是否为空,您可以访问form.data字典,并确保所有条目都是None,尽管您需要小心,因为我知道 FileField 返回 au'None'而不是 real None,所以您会有仔细检查您关心的字段。

于 2013-02-06T14:18:31.350 回答