2009-04-13 20 views
0

Ich versuche, einen einfachen CRUD-Admin-Abschnitt meiner Anwendung zu erstellen. Grundsätzlich möchte ich für ein gegebenes Modell eine Template-Schleife durch die Attribute des Modells in eine einfache Tabelle (sobald ich dies tue, kann ich tatsächlich den CRUD-Teil implementieren). Eine Möglichkeit, dies zu erreichen, besteht darin, dynamisch eine Vorlage mit allen für dieses Modell erforderlichen Template-Tags zu generieren.Google App Engine - Dynamisch erstellte Vorlagen

Pseudocode:

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>") 

den richtigen Text generieren sollte nicht schwierig sein. Ich kann meinem Pseudocode-Modell folgen und es Python tun. Zwei Dinge, die ich mich wundere: 1) Kann ich dies stattdessen mit Django Templating Sprache tun? Verwenden Sie zum Generieren einer Vorlage eine Vorlage. 2) Wie kann ich den Text in eine Datei schreiben, auf die der Vorlagenlader von webapp zugreifen kann?

Ich erinnere mich eine Weile wieder etwas über Laden von Vorlage aus der Datenbank zu sehen. Ist das mit GAE möglich?

DANKE!

+0

Sind Sie sicher, dass Sie nicht nach einem ModelForm (http://docs.djangoproject.com/de/dev/topics/forms/modelforms/) suchen? – daharon

Antwort

1

habe ich dieses Open-Source-Projekt eine Weile zurück: http://code.google.com/p/gae-django-dbtemplates/

Verwendung eine Vorlage eine Vorlage zu erzeugen, sollte in Ordnung sein. Rendern Sie die Vorlage einfach in eine Zeichenfolge. Hier einige Code, den ich verwenden, so kann ich einige XML-Stick in memecache

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

Sie leicht etwas sehr ähnlich und halten Sie das Ergebnis im Datenspeicher tun.

1

Ja, anstatt template.writes zu tun, können Sie die nächste Vorlage generieren - seit template.render(...) gibt nur Text zurück. Sie können dann den zurückgegebenen Text speichern und ihn in den DataStore laden, ihn später abrufen und .render(Context(...)) darauf aufrufen, um den HTML-Code zurückzugeben, den Sie generieren möchten.

Sie können die generierte Vorlage nicht in eine Datei schreiben, da AppEngine-Anwendungen keinen Schreibzugriff auf das Dateisystem haben, sondern nur Lesezugriff.

Wenn Sie Ihre ‚generate_tamplate‘ Funktion ändern, um eine Vorlage zu verwenden, könnte der Pseudo-Code wie folgt aussehen:

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 
0

Andere Möglichkeit, dass meine Meinung nach Apps für GAE vereinfacht viel zu schreiben, wird mit anderen Benutzern Templating-Sprache, wie Mako, mit der Sie Python-Code in die Vorlage einbetten können, also kein Fiedeln erforderlich. Sie würden Modelldaten in die Vorlage (so einfach wie template.render(template_file, model=model) übergeben, und die Vorlage würde wie folgt aussehen:

<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> 

ich this googled blog entry gefolgt Mako in meiner App zu bekommen - es war ganz einfach und funktioniert wie ein Charme.