0

Jinja2でWTformsを使用しており、既存のフォームオブジェクトを編集する新しいインスタンスを作成するかどうかに応じて、テンプレートページのタイトルを変更したいと思います。

これは私がテンプレートに書いたものです:

{% 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 %}と、objプロパティが存在しないため、常にFalseになります(もちろん、objと呼ばれるフィールドがない場合)。

投稿を編集している場合は、使用するIDがあり、データベースで更新する投稿がわかります。現在、それをどこに保存していますか?隠しフィールドとして保存すると仮定すると、次のことができます。

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

フォーム全体が空かどうかを確認したい場合は、form.data辞書にアクセスして、すべてのエントリが空であることを確認できます。ただし、FileFieldは実際のでNoneはなくを返すことがわかっているので、注意が必要です。気になるフィールドを再確認します。u'None'None

于 2013-02-06T14:18:31.350 に答える