Google App Engine — динамически создаваемые шаблоны

Я пытаюсь создать простую административную секцию 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?

БЛАГОДАРНОСТЬ!


person Community    schedule 13.04.2009    source источник
comment
Вы уверены, что не ищете ModelForm (docs.djangoproject.com? /en/dev/topics/forms/modelforms) ?   -  person daharon    schedule 13.04.2009


Ответы (3)


Недавно я видел этот проект с открытым исходным кодом: http://code.google.com/p/gae-django-dbtemplates/

Использование шаблона для создания шаблона должно быть в порядке. Просто визуализируйте шаблон в строку. Вот некоторый код, который я использую, поэтому я могу вставить XML в мем-кеш

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

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

person Sam    schedule 13.04.2009

Да, вместо выполнения 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
person dar    schedule 14.04.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>

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

person tm_lv    schedule 16.05.2009