2010-05-24 17 views
41

Ich möchte eine Variable als Schlüssel in einem Wörterbuch in einer Django-Vorlage verwenden. Ich kann nicht für das Leben von mir herausfinden, wie es geht. Wenn ich ein Produkt mit einem Namen oder ID-Feld habe, und Ratings Wörterbuch mit Indizes des Produkt-IDs, würde Ich mag sagen können:Verwenden Sie Variable als Wörterbuchschlüssel in Django Vorlage

{% for product in product_list %} 
    <h1>{{ ratings.product.id }}</h1> 
{% endfor %} 

In Python dies mit einer einfachen

erreicht werden würde
ratings[product.id] 

Aber ich kann es nicht in den Vorlagen arbeiten. Ich habe versucht mit ... ohne Würfel. Ideen?

+0

mögliche Duplikate von [Wie auf Wörterbuch Element in Django-Vorlage zugreifen?] (Http://StackOverflow.com/Questions/1275735/How-to-Access-Dictionary-Element-in-Django-Template) – Anto

Antwort

16

Sie müssen Ihre Daten vorher vorbereiten, in diesem Fall können Sie die Liste mit zwei Tupel zu Ihrer Vorlage passieren sollte:

{% for product, rating in product_list %} 
    <h1>{{ product.name }}</h1><p>{{ rating }}</p> 
{% endfor %} 
+0

Danke cji! Ich habe versucht, ein anderes Objekt zu vermeiden, aber es ist nicht wirklich wichtig ... es ist sowieso alles zwischengespeichert. – CaptainThrowup

+1

Sie müssen die Daten in der Ansicht nicht vorbereiten, Sie können dasselbe erreichen, indem Sie 'items' im Wörterbuch aufrufen, das bereits im Kontext ist -' {% für Produkt, Bewertung in product_list.items%} 'wird Arbeit. – jhrr

72

Erstellen einer Vorlage Tag wie folgt (in IhrProjekt/templatetags):

@register.filter 
def keyvalue(dict, key):  
    return dict[key] 

Verbrauch:

{{dictionary|keyvalue:key_variable}} 
+2

Sie benötigen auch eine Reihe von Peripherie-Zeug, um diese Arbeit zu machen, so stellen Sie sicher, dass Sie die Dokumentation überprüfen: https://docs.djangoproject.com/en/dev/howto/custom-template-tags/ –

+1

Kann dies für verkettet werden verschachtelte dicts? Etwas wie '{{dictionary | keyvalue: schlüssel_variable | schlüsselwert: another_key}}'? –

+0

Theoretisch ja, probier es aus;) – eviltnan

12

Es gibt eine sehr schmutzig Lösung:

<div>We need d[{{ k }}]</div> 

<div>So here it is: 
{% for key, value in d.items %} 
    {% if k == key %} 
     {{ value }} 
    {% endif %} 
{% endfor %} 
</div> 
7

Aufbauend auf eviltnan Antwort, wird seine Filter eine Ausnahme auslösen, wenn key kein Schlüssel von dict ist.

Filter sollten niemals Ausnahmen auslösen, sollten aber fail gracefully. Dies ist eine robustere/vollständige Antwort:

@register.filter 
def keyvalue(dict, key):  
    try: 
     return dict[key] 
    except KeyError: 
     return '' 

Grundsätzlich würde dies die gleiche wie dict.get(key, '') in Python-Code tun, und auch auf diese Weise geschrieben werden können, wenn Sie wollen den Versuch nicht enthalten/außer Block, obwohl es expliziter ist.

+9

statt dict [key] benutzt man einfach die eingebaute python dictionary get Methode. z. B .: return dict.get (key, '') – user772401

Verwandte Themen