Seite 1 von 1

Dict mit Liste im Template entpacken

Verfasst: Mittwoch 28. September 2011, 12:58
von Damaskus
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

Re: Dict mit Liste im Template entpacken

Verfasst: Mittwoch 28. September 2011, 13:14
von jens

Re: Dict mit Liste im Template entpacken

Verfasst: Donnerstag 29. September 2011, 07:10
von Damaskus
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

Re: Dict mit Liste im Template entpacken

Verfasst: Donnerstag 29. September 2011, 19:54
von Hyperion
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!

Re: Dict mit Liste im Template entpacken

Verfasst: Sonntag 2. Oktober 2011, 12:41
von apollo13
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]