wake-up-neo.com

Django Vorlage zum Nachschlagen eines Wörterbuchwerts mit einer Variablen

mydict = {"key1":"value1", "key2":"value2"}

Die übliche Methode zum Nachschlagen eines Wörterbuchwerts in einer Django Vorlage ist {{ mydict.key1 }}, {{ mydict.key2 }}. Was ist, wenn der Schlüssel eine Schleifenvariable ist? dh:

{% for item in list %} # where item has an attribute NAME
  {{ mydict.item.NAME }} # I want to look up mydict[item.NAME]
{% endfor %}

mydict.item.NAME schlägt fehl. Wie kann man das beheben?

198
Stan

Schreiben Sie einen benutzerdefinierten Vorlagenfilter:

from Django.template.defaulttags import register
...
@register.filter
def get_item(dictionary, key):
    return dictionary.get(key)

(Ich benutze .get Wenn der Schlüssel nicht vorhanden ist, wird kein Schlüssel zurückgegeben. Wenn Sie tun dictionary[key] es wird dann ein KeyError ausgelöst.)

verwendungszweck:

{{ mydict|get_item:item.NAME }}
316
culebrón

Rufen Sie den Schlüssel und den Wert aus dem Wörterbuch in der Schleife ab:

{% for key, value in mydict.items %}
    {{ value }}
{% endfor %}

Ich finde das einfacher zu lesen und es macht keine spezielle Codierung erforderlich. Normalerweise brauche ich den Schlüssel und den Wert in der Schleife trotzdem.

47
Paul Whipp

Sie können nicht standardmäßig. Der Punkt ist das Trennzeichen/der Auslöser für die Attributsuche/Schlüsselsuche/Scheibe.

Punkte haben beim Rendern von Vorlagen eine besondere Bedeutung. Ein Punkt in einem Variablennamen kennzeichnet eine Suche. Wenn das Vorlagensystem auf einen Punkt in einem Variablennamen stößt, werden die folgenden Suchvorgänge in dieser Reihenfolge ausgeführt:

  • Wörterbuch-Suche. Beispiel: foo ["bar"]
  • Attributsuche. Beispiel: foo.bar
  • Listenindex-Suche. Beispiel: foo [bar]

Sie können jedoch einen Filter erstellen, mit dem Sie ein Argument übergeben können:

https://docs.djangoproject.com/de/dev/howto/custom-template-tags/#writing-custom-template-filters

@register.filter(name='lookup')
def lookup(value, arg):
    return value[arg]

{{ mydict|lookup:item.name }}
31

Ich hatte eine ähnliche Situation. Ich habe jedoch eine andere Lösung verwendet.

In meinem Modell erstelle ich eine Eigenschaft, die die Wörterbuchsuche durchführt. In der Vorlage verwende ich dann die Eigenschaft.

In meinem Modell: -

@property
def state_(self):
    """ Return the text of the state rather than an integer """
    return self.STATE[self.state]

In meiner Vorlage: -

The state is: {{ item.state_ }}
2
sexybear2

Für mich hat das Erstellen einer python Datei mit dem Namen template_filters.py In meiner App mit dem folgenden Inhalt den Job erledigt

# coding=utf-8
from Django.template.base import Library

register = Library()


@register.filter
def get_item(dictionary, key):
    return dictionary.get(key)

nutzung ist wie das, was culebrón sagte:

{{ mydict|get_item:item.NAME }}
2
AmiNadimi

env: Django 2.1.7

aussicht:

dict_objs[query_obj.id] = {'obj': query_obj, 'tag': str_tag}
return render(request, 'obj.html', {'dict_objs': dict_objs})

vorlage:

{% for obj_id,dict_obj in dict_objs.items %}
<td>{{ dict_obj.obj.obj_name }}</td>
<td style="display:none">{{ obj_id }}</td>
<td>{{ forloop.counter }}</td>
<td>{{ dict_obj.obj.update_timestamp|date:"Y-m-d H:i:s"}}</td>
0
Yi Yang Apollo