Шаблон не отображает GAE и Jinja2

Когда я посещаю /admin/newpost, я ожидаю, что мой шаблон edit.html отобразит и отобразит поля моей формы. Вместо этого я получаю пустую страницу без ошибок. Однако, когда я просматриваю исходный код, я вижу следующее.

<Template '/edit.html'>

Я не получаю никаких ошибок, поэтому нет отслеживания стека.

  • Версия GAE: 1.7
  • Виндовс 7 64 бит
  • последняя версия jinja2
  • питон 2.7

Мой код и шаблон ниже

Вот мой код:

import os
import webapp2
import config
import jinja2


from google.appengine.ext import db

import fix_path
import config
import static
import wtforms
from wtforms.ext.appengine.db import model_form
from wtforms import Form, TextField, validators


def render_template(template_name, template_vals=None, theme=None):
    template_path = os.path.join(os.path.dirname(__file__) , \
            "themes", theme or config.theme)
    env = jinja2.Environment(
        loader=jinja2.FileSystemLoader(template_path))
    return env.get_template(template_name, template_vals or {})


class BlogPost(db.Model):
    #The URL path to the blog post. Posts have a path if they are published.
    path = db.StringProperty()
    title = db.StringProperty(required=True, indexed=False)
    body = db.TextProperty(required=True)
    published = db.DateTimeProperty(auto_now_add=True)
    updated = db.DateTimeProperty(auto_now=True)

    def render(self):
        template_vals = {
            'config': config,
            'post': self,
        }
        return render_template("post.html", template_vals)

form = model_form(BlogPost, Form)

class PostForm(form):
    pass

class PostHandler(webapp2.RequestHandler):

    @webapp2.cached_property
    def jinja2(self):
        return jinja2.get_jinja2(app=self.app)

    def render_to_response(
        self,
        template_name,
        template_vals=None,
        theme=None
        ):
        template_name = "admin/%s" % template_name
        self.response.out.write(render_template(
            template_name, template_vals, theme))

    def render_form(self, form):
        self.render_to_response("edit.html", {'form': form})

    def get(self):
        self.render_form(PostForm())

app = webapp2.WSGIApplication([('/admin/newpost', PostHandler)],
                              debug=True)

Вот мой шаблон:

{% extends "base.html" %}
{% block title %}Testing New Post Template{% endblock %}
{% block body %}
  <form method="post" action="">
    <table>

<div>{{ form.title.label }}: {{ form.title(class="css_class") }}</div>
{% if form.title.errors %}
        <ul class="errors">{% for error in form.name.errors %}<li>{{ error }}</li>{% endfor %}</ul>
    {% endif %}

<div>{{ form.body.label }}: {{ form.body() }}</div>
{% if form.body.errors %}
        <ul class="errors">{% for error in form.body.errors %}<li>{{ error }}</li>{% endfor %}</ul>
    {% endif %}

    </table>
    <input type="submit" />
  </form>
{% endblock %}

Мой файл app.yaml

application: cmwo-blog
version: 1
runtime: python27
api_version: 1
threadsafe: no

handlers:

- url: /admin/.*
  script: admin.app
  login: admin

- url: /favicon\.ico
  static_files: favicon.ico
  upload: favicon\.ico

- url: /static/([^/]+)/(.*)
  static_files: themes/\1/static/\2
  upload: themes/[^/]+/static/.*

- url: .*
  script: static.app

builtins:
- remote_api: on

libraries:
- name: webapp2
  version: "2.5.1"

- name: jinja2
  version: latest

person Busilinks    schedule 29.07.2012    source источник


Ответы (1)


Я не использую Jinja, но ваш метод render_template, похоже, не отображает шаблон. Он вызывает env.get_template, который предположительно получает объект шаблона, но затем ему нужно вызвать что-то, чтобы фактически отобразить этот шаблон - бегло просмотрев документация, вы должны сделать это:

template = env.get_template(template_name)
return template.render(**(template_vals or {}))
person Daniel Roseman    schedule 29.07.2012
comment
Большое спасибо. Это, кажется, проблема. Одна вещь, которую я не понимаю в решении, это return template.render(**(template_vals или {})). Что это делает? - person Busilinks; 29.07.2012
comment
О каком именно бите вы спрашиваете? - person Daniel Roseman; 29.07.2012
comment
Я не понимаю часть рендеринга (**(). Я предполагаю, что это похоже на подстановочные знаки для аргументов ключевого слова. Как вы можете заметить, я новичок в Python. Еще раз спасибо за вашу помощь. - person Busilinks; 30.07.2012
comment
Он преобразует словарь template_vals в аргументы ключевого слова, что эквивалентно, например, template.render(config='foo', post='bar'). - person Daniel Roseman; 30.07.2012