Google App Engine - 动态创建模板

时间:2009-04-13 18:05:53

标签: python google-app-engine templates django-templates

我正在尝试为我的应用程序构建一个简单的CRUD管理部分。基本上,对于给定的Model,我想让模板循环通过模型的属性到一个简单的表中(一旦我这样做,我实际上可以实现CRUD部分)。实现此目标的一种可能方法是动态生成一个模板,其中包含特定于该模型的所有必要模板标记。

伪代码:

def generate_tamplate(model):
     template.write("<table border='1'>")
     template.write("<tr>")
     for attribute in model:
          template.write("<td>%s</td>" % attribute)
     template.write("</tr>")
     template.write("<tr>")
     for attribute in model:
          template.write("<td>{{ %s.%s }}</td>" % model.attribute)
     template.write("</tr>")
     template.write("</table>")

生成正确的文本应该不难。我可以按照我的伪代码模型进行Python操作。我想知道两件事: 1)我可以使用Django的模板语言来代替吗?也就是说,使用模板生成模板 2)生成文本后,如何将其写入webapp模板加载器可以访问的文件中?

我记得有一段时间看到有关从数据库加载模板的事情。这可能与GAE有关吗?

谢谢!

3 个答案:

答案 0 :(得分:1)

我前段时间看到了这个开源项目: http://code.google.com/p/gae-django-dbtemplates/

使用模板生成模板应该没问题。只需将模板渲染为字符串即可。这里使用了一些代码,所以我可以将一些xml粘贴到memecache

path = os.path.join(os.path.dirname(__file__), 'line_chart.xml')
xml = template.render(path, template_values)

您可以轻松地执行非常类似的操作并将结果粘贴到数据存储区中。

答案 1 :(得分:1)

是的,您可以生成下一个模板,而不是template.writes,因为template.render(...)只返回文字。然后,您可以存储返回的文本并将其放入DataStore,然后在以后检索它并在其上调用.render(Context(...))以返回您要生成的html。

您无法将生成的模板写入文件 - 因为AppEngine应用程序没有对文件系统的写访问权限,只能读取访问权限。

如果您更改“generate_tamplate”功能以使用模板,则伪代码可能如下所示:

from google.appengine.ext.webapp import template

def generate_tamplate(model):
    t = template.render(path_to_template1.html, Context({'model':model}))
    DataStoreTemplate(template=t, name=model.name).put()

''' Later, when you want to generate your page for that model '''
def generate_page(model):
    t = DataStoreTemplate.all().filter("name =",model.name).get().template
    htmlresult = t.render(Context({'model':model}))
    return htmlresult

答案 2 :(得分:0)

其他选项,在我看来简化了为GAE编写应用程序,使用用户其他模板语言,如Mako,允许您在模板中嵌入Python代码,因此不需要摆弄。 您可以将模型数据传递给模板(就像template.render(template_file, model=model一样简单),模板看起来像这样:

<table border='1'>
  <tr>
      % for attribute in model:
        <td>${attribute}</td>
      % endfor
  </tr>
  <tr>
      % for attribute in model:
        <td>${model.attribute}</td>
      % endfor
  </tr>
</table>

我跟着this googled blog entry在我的应用程序中获取Mako - 这很简单,就像一个魅力。