2012-07-29 62 views
0

当我访问/ admin/newpost我希望我的edit.html模板可以渲染并显示我的表单域。相反,我得到一个没有错误的空白页面。但是,当我查看源代码时,我看到以下内容。模板不能显示GAE&Jinja2

<Template '/edit.html'> 

所以不能叠加轨迹我没有得到任何错误。

  • GAE版本:1.7
  • 的Windows 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 

回答

2

我不使用神社,但是你render_template方法似乎并没有被实际渲染的模板。它调用env.get_template,这大概得到一个模板对象,但后来需要调用一些实际渲染模板 - 在the documentation快速寻找,你应该这样做:

template = env.get_template(template_name) 
return template.render(**(template_vals or {})) 
+0

非常感谢。这似乎是问题。有一件事我不明白解决方案是return template.render(**(template_vals或{}))。这是做什么的? – Busilinks 2012-07-29 16:47:27

+0

你有什么特别的问题? – 2012-07-29 18:57:46

+0

我不理解渲染(**(部分,我假设这些就像关键字参数的通配符一样,你可以告诉我是Python的新手,再次感谢您的帮助 – Busilinks 2012-07-30 12:01:19