Google App Engine - динамически создаваемые шаблоны - PullRequest
0 голосов
/ 13 апреля 2009

Я пытаюсь создать простой раздел администрирования CRUD моего приложения. По сути, для данной Модели я хочу, чтобы шаблонный цикл по атрибутам модели превращался в простую таблицу (как только я это сделаю, я смогу реализовать часть 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) Как только я сгенерирую текст, как я могу записать его в файл, к которому может иметь доступ загрузчик шаблонов веб-приложения?

Я помню, как некоторое время назад видел что-то о загрузке шаблона из базы данных. Это возможно с GAE?

СПАСИБО!

Ответы [ 3 ]

1 голос
/ 14 апреля 2009

Да, вместо того, чтобы делать template.writes, вы можете сгенерировать следующий шаблон - так как template.render(...) просто возвращает текст. Затем вы можете сохранить возвращенный текст и поместить его в хранилище данных, затем извлечь его позже и вызвать .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
1 голос
/ 14 апреля 2009

Я видел этот проект с открытым исходным кодом некоторое время назад: 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)

Вы можете легко сделать что-то очень похожее и вставить результат в хранилище данных.

0 голосов
/ 16 мая 2009

Другой вариант, который, на мой взгляд, сильно упрощает написание приложений для 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>

Я подписался на эту запись в блоге с гуглом , чтобы получить Мако в своем приложении - это было довольно просто и работает как шарм.

...