jinja2: Daten an Template übergeben

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
marlob
User
Beiträge: 51
Registriert: Mittwoch 23. August 2006, 20:13

Hallo,

ich habe ein Script wo ich Daten an jinja2 übergeben will. Ich benutze python 2.7 auf Windows 7

Folgendes Problem.
Ich habe ein Dictionary:

Code: Alles auswählen

template_variables = {'source2': [{'Roboter': u'Rob2', 'Zone': u'WT1'}, {'Roboter': u'Rob2', 'Zone': u'WT2'}], 'source1': [{'Roboter': u'Rob1', 'Ablegen': u'WT1'}, {'Roboter': u'Rob1', 'Ablegen': u'WT2'}]}
Dieses möchte ich an die render Methode von jinja2 übergeben

Wenn ich folgendes programmiere:

Code: Alles auswählen

import jinja2
loader = jinja2.FileSystemLoader(template_dir)
j2_env = jinja2.Environment(loader=loader)
print j2_env.get_template(template_file).render(source1=template_variables['source1'], source2=template_variables['source2'])
funktioniert das ganze gut.
Ich habe aber unterschiedlich grosse Dictionarys. Es kann also noch ein source3, source4 usw. bis sourceN geben.
wir übergebe ich das an die render Methode?

Code: Alles auswählen

print j2_env.get_template(template_file).render(items=template_variables)
funktioniert jedenfalls nicht
Zuletzt geändert von Hyperion am Donnerstag 27. September 2012, 17:33, insgesamt 1-mal geändert.
Grund: Quellcode in Python-Code-Tags gesetzt
gruss
marlob
-------------------------------------
Linux Mint 17 + Python 2.7.6
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Ganz einfach: Übergib einfach das Dictionary und nicht die Listenkomponenten aus dem Dictionary ;-)

Bist Du Dir eigentlich sicher, dass Du da ein Dictionary brauchst? Deine Keys scheinen ja nummeriert zu sein - da kannst Du dann besser direkt eine Liste nehmen.
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
marlob
User
Beiträge: 51
Registriert: Mittwoch 23. August 2006, 20:13

Das Dictionary template_variables ist stark vereinfacht.
Ich lese Daten aus verschiedenen Quellen. source1 kann z.B. aus Sheet1 einer Exceldatei stammen, source2 aus einer Datenbank usw.
Alle Resultate aus den verschiedenen Quellen kommen dann in das Dictionary template_variables.
Und alle Daten will ich an das Template übergeben
Wenn ich aber das Dictionary direkt übergebe dann bekomme ich eine Fehlermeldung.
Bin momentan nicht vor meinem Rechner wo ich das programmiert habe.
Ich poste morgen mal die Fehlermeldung.
gruss
marlob
-------------------------------------
Linux Mint 17 + Python 2.7.6
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

marlob hat geschrieben: Ich lese Daten aus verschiedenen Quellen. source1 kann z.B. aus Sheet1 einer Exceldatei stammen, source2 aus einer Datenbank usw.
Alle Resultate aus den verschiedenen Quellen kommen dann in das Dictionary template_variables.
Mit anderen Worten in echt heißen die Schlüssel nicht ``source1`` und ``source2`` usw, sondern sind komplett verschieden?
marlob hat geschrieben: Wenn ich aber das Dictionary direkt übergebe dann bekomme ich eine Fehlermeldung.
Bin momentan nicht vor meinem Rechner wo ich das programmiert habe.
Ich poste morgen mal die Fehlermeldung.
Das mach mal. Ohne Fehlermeldung kann man schwerlich etwas dazu sagen!

Im übrigen hättest Du das doch schon mal direkt erwähnen können, dass Du das schon ausprobiert hattest. Bei Deiner Frage hätte Dir doch klar sein müssen, dass der von mir gegebene Tipp hier sofort kommt...
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
marlob
User
Beiträge: 51
Registriert: Mittwoch 23. August 2006, 20:13

Hyperion hat geschrieben: Mit anderen Worten in echt heißen die Schlüssel nicht ``source1`` und ``source2`` usw, sondern sind komplett verschieden?
Genau, das können beliebige Namen sein.
Hyperion hat geschrieben: Im übrigen hättest Du das doch schon mal direkt erwähnen können, dass Du das schon ausprobiert hattest. Bei Deiner Frage hätte Dir doch klar sein müssen, dass der von mir gegebene Tipp hier sofort kommt...
Hatte ich im ersten Beitrag erwähnt, das das nicht funktioniert :wink:

Ich hatte auch schon ein Minimalbeispiel zusammengepackt, konnte aber nicht so schnell finden wo ich Dateien hochlade und das auf später verschoben weil ich einen Termin hatte. Werde ich morgen nachholen, wenn ich wieder vorm richtigen Rechner sitze.

Bis dahin schon mal Danke für die Hilfe :)
gruss
marlob
-------------------------------------
Linux Mint 17 + Python 2.7.6
marlob
User
Beiträge: 51
Registriert: Mittwoch 23. August 2006, 20:13

Hallo,

habe den Fehler gefunden. Ich hatte, wie Hyperion schon richtig vorgeschlagen hat, das ganze Dictionary übergeben.
Leider hatte ich vergessen mein Template anzupassen, so das eine Fehlermeldung erzeugt wurde.
Diese habe ich fälschlicherweise in meinem Script gesucht und nicht im Template.
Also das ganze Dictionary zu übergeben funktioniert jedenfalls.
Nochmals danke für die Hilfe :D
gruss
marlob
-------------------------------------
Linux Mint 17 + Python 2.7.6
marlob
User
Beiträge: 51
Registriert: Mittwoch 23. August 2006, 20:13

So rein interessehalber. Kann ich eine Funktion IrgendeineFunktion() programmieren, so das ich folgendes programmieren kann:

Code: Alles auswählen

print j2_env.get_template(template_file).render(IrgendeineFunktion(template_variables))
mit folgendenm Dictionary

Code: Alles auswählen

template_variables = {'source2': [{'Roboter': u'Rob2', 'Zone': u'WT1'}, {'Roboter': u'Rob2', 'Zone': u'WT2'}], 'source1': [{'Roboter': u'Rob1', 'Ablegen': u'WT1'}, {'Roboter': u'Rob1', 'Ablegen': u'WT2'}]}
und es wird folgendes erzeugt

Code: Alles auswählen

print j2_env.get_template(template_file).render(source1=template_variables['source1'], source2=template_variables['source2'])
Also IrgendeineFunktion(template_variables) erzeugt mir dann

Code: Alles auswählen

source1=template_variables['source1'], source2=template_variables['source2']
gruss
marlob
-------------------------------------
Linux Mint 17 + Python 2.7.6
Benutzeravatar
Sr4l
User
Beiträge: 1091
Registriert: Donnerstag 28. Dezember 2006, 20:02
Wohnort: Kassel
Kontaktdaten:

marlob hat geschrieben:So rein interessehalber. Kann ich eine Funktion IrgendeineFunktion() programmieren, so das ich folgendes programmieren kann:

Code: Alles auswählen

print j2_env.get_template(template_file).render(IrgendeineFunktion(template_variables))
für genau das von dir gewünschte Verhalten gibt es etwas
ist das in deinem Python Tutorial nicht vorgekommen? :-)

Code: Alles auswählen

print j2_env.get_template(template_file).render(**template_variables)
marlob
User
Beiträge: 51
Registriert: Mittwoch 23. August 2006, 20:13

Sr4l hat geschrieben: für genau das von dir gewünschte Verhalten gibt es etwas
ist das in deinem Python Tutorial nicht vorgekommen? :-)

Code: Alles auswählen

print j2_env.get_template(template_file).render(**template_variables)
Danke für die Lösung :) Funktioniert genauso wie ich das möchte!

P.S.
leider kann man sich nicht alles aus dem Tutorial merken und ich benutze Python auch nicht hauptberuflich und regelmässig sondern nebenbei alle paar Monate bei Bedarf. :D
Und hier hat auch der ein oder andere Erfahrene schon Fragen gestellt die das Tutorial beantwortet. Du vielleicht auch schon :wink:
Der Smiley dahinter ist hoffentlich gut sichtbar :D Also nichts für ungut und nochmal Danke!
gruss
marlob
-------------------------------------
Linux Mint 17 + Python 2.7.6
Antworten