Проверка наличия экземпляра формы в Jinja2

Я использую 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})

Короче говоря, все, что я пытаюсь сделать, это проверить, заполнена ли форма, и соответственно изменить заголовок моей страницы «Новое сообщение» или «Редактировать сообщение».


person jwogrady    schedule 30.01.2013    source источник


Ответы (1)


Хотя Form принимает аргумент obj, она на самом деле не сохраняет его, а просто использует этот obj для заполнения любых пробелов, которые не предоставлены formdata. Поэтому, когда вы спрашиваете Jinja2 {% if form.obj %}, это всегда будет False, потому что никогда не существует свойства obj (если, конечно, у вас нет поля, которое называется obj).

Если вы редактируете пост, у вас будет идентификатор для работы, чтобы вы знали, какой пост обновить в базе данных, так где вы сейчас его храните? Предполагая, что вы храните его как скрытое поле, вы можете просто сделать:

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

Если вы хотите проверить, пуста ли вся форма, вы можете получить доступ к словарю form.data и убедиться, что все записи None, хотя вам нужно быть осторожным, потому что я знаю, что FileField возвращает u'None' вместо реального None, поэтому вам придется перепроверить, какие поля вам небезразличны.

person Doobeh    schedule 06.02.2013