Dict mit Liste im Template entpacken

Django, Flask, Bottle, WSGI, CGI…
Antworten
Benutzeravatar
Damaskus
Administrator
Beiträge: 999
Registriert: Sonntag 6. März 2005, 20:08
Wohnort: Schwabenländle

Hallo Zusammen,

ich sitze mal wieder an einem vermutlich ziemlich simplen Problem und komme nicht auf die Lösung.
Ich erzeuge folgendes Dictionary im View und möchte es im Template wieder entpacken:

Code: Alles auswählen

listAcc = ['key1', 'key2']
dictDom = {u'key1': [u'value1', u'value2', u'value3'], u'key2': [u'value1', u'value2', u'value3']}
Als Template verwende ich:

Code: Alles auswählen

				<ul class="ora">
					{% for key in listAcc %}
					<li><tt>{{ acc }}</tt>
							<ul class="blue">
								{% for value in dictDom.key %}
								<li>{{ value }}</li>
								{% endfor %}
							</ul>
					</li>
					{% endfor %}
				</ul>
Ziel ist es im Browser eine verschachtelte Liste dar zu stellen.

- key1
--value1
--value2
--value3
-key2
--value1...

Allerdings wird die zweite for Schleife nicht korrekt dar gestellt bzw. sie wird gar nciht durchlaufen.
Kann es sein, dass die Variable "key" aus {% for key in listAcc %} für die zweite Schleife {% for value in dictDom.key %} gar nicht zur Verfügung steht?

Gruß
Damaskus
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:


GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Benutzeravatar
Damaskus
Administrator
Beiträge: 999
Registriert: Sonntag 6. März 2005, 20:08
Wohnort: Schwabenländle

Hallo Jens,

danke für den Hinweis, es hilft!
ABER es ist extrem umständlich und Resourcen fressend.
Versteh ich nicht, dass die Django Leute solche rekursive Schleifen nicht direkt im Template ermöglichen.

Gruß
Damaskus
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Ich kenne mich mit Djangos Template Engine nicht aus, aber für jinja2 gibt es da einen Trick. Evtl. gibt es so ein `set` auch bei Django?

Ansonsten guck doch mal bei den "Special Variables" einer for-Schleife. Da gabs iirc eine Möglichkeit auf die Parent-Schleife zuzugreifen!
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
apollo13
User
Beiträge: 827
Registriert: Samstag 5. Februar 2005, 17:53

Hi,

dein Problem ist, dass dict.key so wie du es versuchst nicht geht, django kann nicht object[key] im template auflösen, {{ dict.key }} wird übersetzt nach dict['key'] bzw mit etwas Pech überhaupt auf die .key function vom dict. Wenn das was du brauchst wirklich dem entspricht was du geschrieben hast und nicht nur ein vereinfachtes Beispiel ist sollte http://django.me/regroup und vlt auch http://django.me/dictsort helfen (bzw im view vorsortieren). Damit deine einfache Lösung geht müsstest du einen Filter schreiben ala dict|get_value:key, das würde gehen…

jens' Lösung ist imo für dieses Problem etwas übertrieben, ist aber natürlich gut für tiefer verschachtelte Sachen.

EDIT:// key ist natürlich auch in der inneren Schleife da solange du es nicht überschreibst, ein {{ key }} sollte das beweisen, nur {{ dict.key }} ist nicht gleich dict[key]
Antworten