Referenzlistenelement nach Index in der Django-Vorlage?

105

Das mag einfach sein, aber ich sah mich um und konnte keine Antwort finden. Wie kann ein einzelnes Element in einer Liste aus einer Django-Vorlage am besten referenziert werden?

Mit anderen Worten, wie mache ich das Äquivalent {{ data[0] }}innerhalb der Vorlagensprache?

Vielen Dank.

user456584
quelle

Antworten:

181

Es sieht aus wie {{ data.0 }}. Siehe Variablen und Lookups .

Mike DeSimone
quelle
47
Das nervige ist, dass ich nicht sagen kann {{ data.foo }}, wo foosich eine Variable mit einem Indexwert und nicht einem Eigenschaftsnamen befindet.
Mike DeSimone
1
Wenn Sie bereit sind, ein benutzerdefiniertes Tag zu erstellen, können Sie noch viel mehr tun. Hier arbeiten wir nur mit den eingebauten Sachen.
Mike DeSimone
Link funktioniert nicht mehr, versuchen Sie diesen: docs.djangoproject.com/de/1.10/ref/templates/api/…
Speccy
75

Ein besserer Weg: Benutzerdefinierter Vorlagenfilter: https://docs.djangoproject.com/de/dev/howto/custom-template-tags/

wie get my_list [x] in Vorlagen:

in Vorlage

{% load index %}
{{ my_list|index:x }}

templatetags / index.py

from django import template
register = template.Library()

@register.filter
def index(indexable, i):
    return indexable[i]

Wenn my_list = [['a','b','c'], ['d','e','f']], können Sie {{ my_list|index:x|index:y }}in Vorlage verwenden, um zu erhaltenmy_list[x][y]

Es funktioniert gut mit "für"

{{ my_list|index:forloop.counter0 }}

Getestet und funktioniert gut ^ _ ^

WeizhongTu
quelle
1
Eine der einfachsten Erklärungen zum Erlernen der Anwendung von Template Tags!
vanguard69
5
Das war großartig! Wie kann ich mit dem Format {{List | index: x}} auf Werte zugreifen, bei denen ich normalerweise einen Punkt verwenden würde? {{(Liste | Index: x) .name}} funktioniert offensichtlich nicht. Danke dir!
JTFouquier
Genau das, wonach ich gesucht habe. Danke dir!
Grant Bartel
Ich habe ein Array, in dem ich nicht sicher bin, welchen Index mein gewünschter Wert hat{% for id in article_details.heading.contents.article_ids %} {% if id.type == 'DOI' %} {{ article_details.heading.contents.article_ids.forloop.counter0.value }} {% endif %} {% endfor %}
Akin Hwan
Ich iteriere durch eine Liste (Übereinstimmungen), während ich iteriere, habe ich eine andere Liste, in der ich den Index (counter0) verwenden möchte. Ich habe versucht, {{matchTeamEmblems.forloop.counter0.homeTeamID}}, aber es funktioniert nicht, die matchTeamEmblems sind eine Liste Ich generiere in simple_tag, das eine URL (statisch ..) für meine Embleme erstellt, aber ich kann nicht darauf zugreifen
kaya
24

{{ data.0 }} sollte arbeiten.

data.objAngenommen , Sie haben Django-Versuche geschrieben data.objund data.obj(). Wenn sie nicht funktionieren, versucht es data["obj"]. In Ihrem Fall data[0]kann geschrieben werden als {{ data.0 }}. Ich empfehle Ihnen jedoch, data[0]die Ansicht aufzurufen und als separate Variable zu senden.

Yilmazhuseyin
quelle
1

@ jennifer06262016, Sie können definitiv einen weiteren Filter hinzufügen, um die Objekte in einem Django-Queryset zurückzugeben.

@register.filter 
def get_item(Queryset):
    return Queryset.your_item_key

In diesem Fall würden Sie so etwas wie {{Queryset | index: x | get_item}} in Ihre Vorlage eingeben, um auf ein Wörterbuchobjekt zuzugreifen. Für mich geht das.

Kendrick Fong
quelle