Référence élément de liste par index dans le modèle Django?

107

Cela peut être simple, mais j'ai regardé autour de moi et je n'ai pas trouvé de réponse. Quelle est la meilleure façon de référencer un seul élément dans une liste à partir d'un modèle Django?

En d'autres termes, comment puis-je faire l'équivalent de {{ data[0] }}dans le langage du modèle?

Merci.

user456584
la source

Réponses:

184

Cela ressemble à {{ data.0 }}. Voir Variables et recherches .

Mike DeSimone
la source
47
Ce qui est ennuyeux, c'est que je ne peux pas dire {{ data.foo }}, où se footrouve une variable avec une valeur d'index et pas un nom de propriété.
Mike DeSimone
1
Si vous souhaitez créer une balise personnalisée, vous pouvez faire bien plus. Ici, nous travaillons simplement avec les éléments intégrés.
Mike DeSimone
Le lien ne fonctionne plus, essayez celui-ci: docs.djangoproject.com/en/1.10/ref/templates/api/…
Speccy
76

Un meilleur moyen: filtre de modèle personnalisé: https://docs.djangoproject.com/en/dev/howto/custom-template-tags/

comme get my_list [x] dans les modèles:

dans le modèle

{% 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]

si my_list = [['a','b','c'], ['d','e','f']], vous pouvez utiliser {{ my_list|index:x|index:y }}dans le modèle pour obtenirmy_list[x][y]

Cela fonctionne bien avec "pour"

{{ my_list|index:forloop.counter0 }}

Testé et fonctionne bien ^ _ ^

WeizhongTu
la source
1
Une des explications les plus simples pour apprendre l'application de Template Tags!
vanguard69
5
C'était super! Mais avec le format {{List | index: x}}, comment accéder aux valeurs là où j'utiliserais normalement un point? {{(List | index: x) .name}} ne fonctionne évidemment pas. Je vous remercie!
JTFouquier
Exactement ce que je cherchais. Je vous remercie!
Grant Bartel
J'ai un tableau dans lequel je ne suis pas sûr de l'indice de ma valeur souhaitée{% 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
J'itère une liste (correspondances), tout en itérant j'ai une autre liste où je veux utiliser l'index (counter0), j'ai essayé {{matchTeamEmblems.forloop.counter0.homeTeamID}} mais ça ne fonctionne pas, le matchTeamEmblems est une liste Je génère dans simple_tag qui construit une URL (statique ..) pour mes emblèmes mais je ne peux pas y accéder
kaya
24

{{ data.0 }} devrait marcher.

Disons que vous avez écrit des data.objessais django data.objet data.obj(). S'ils ne fonctionnent pas, il essaie data["obj"]. Dans votre cas data[0]peut être écrit comme {{ data.0 }}. Mais je vous recommande d'extraire data[0]la vue et de l'envoyer en tant que variable distincte.

yilmazhuseyin
la source
1

@ jennifer06262016, vous pouvez certainement ajouter un autre filtre pour renvoyer les objets dans un ensemble de requêtes django.

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

Dans ce cas, vous tapez quelque chose comme ceci {{Queryset | index: x | get_item}} dans votre modèle pour accéder à un objet de dictionnaire. Ça marche pour moi.

Kendrick Fong
la source