mydict = {"key1":"value1", "key2":"value2"}
Die normale 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 ich das beheben?
Rufen Sie sowohl den Schlüssel als auch den Wert aus dem Wörterbuch in der Schleife ab:
Ich finde das leichter zu lesen und vermeide die Notwendigkeit einer speziellen Codierung. Normalerweise brauche ich sowieso den Schlüssel und den Wert in der Schleife.
quelle
Sie können nicht standardmäßig. Der Punkt ist das Trennzeichen / der Auslöser für die Attributsuche / Schlüsselsuche / Slice.
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
quelle
return value.get(arg)
da dies keine KeyError-Ausnahme auslösen würde, wenn der Schlüssel nicht vorhanden ist.Für mich hat das Erstellen einer Python-Datei mit dem Namen
template_filters.py
in meiner App mit dem folgenden Inhalt den Job erledigtVerwendung ist wie das, was Culebrón sagte:
quelle
register = Library()
? Was tut es ?django.template.base.Library
class registrieren . indemregister = Library()
wir diese Klasse instanziieren und denfilter
Funktionsanmerker darin verwenden, um unseren Bedarf zu decken.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: -
In meiner Vorlage: -
quelle
Da ich keinen Kommentar abgeben kann, lassen Sie mich dies in Form einer Antwort tun: Um auf der Antwort
von Culebrón oder der Antwort von Yuji 'Tomita' Tomita aufzubauen , hat das an die Funktion übergebene Wörterbuch die Form einer Zeichenfolge. Verwenden Sie also möglicherweise ast. literal_eval , um die Zeichenfolge zuerst in ein Wörterbuch zu konvertieren, wie in diesem Beispiel .
Bei dieser Bearbeitung sollte der Code folgendermaßen aussehen:
quelle
Umwelt: Django 2.2
Ich habe diesen Code in eine Datei mit dem Namen template_filters.py in meinem Projektordner mit dem Namen portfoliomgr eingefügt
Unabhängig davon , wo Sie Ihren Filtercode ablegen , stellen Sie sicher, dass Sie __init__.py in diesem Ordner haben
Fügen Sie diese Datei zum Abschnitt "Bibliotheken" im Abschnitt "Vorlagen" in Ihrer Datei "projectfolder / settings.py" hinzu. Für mich ist es portfoliomgr / settings.py
Laden Sie in Ihren HTML-Code die Bibliothek
quelle
env: django 2.1.7
Aussicht:
Vorlage:
quelle
{{ dict_obj.obj.obj_name }}
in diesem Fall dem Python-Codedict_obj["obj"]["obj_name"]
, die Frage bezieht sich jedoch auf das Äquivalent vondict_obj[obj][obj_name]
.