Как получить доступ к элементам массива в шаблоне Django?


167

Я получаю массив, arrпереданный моему шаблону Django. Я хочу получить доступ к отдельным элементам массива в массиве (например arr[0], arr[1]) и т. Д. Вместо циклического прохождения по всему массиву.

Есть ли способ сделать это в шаблоне Django?


4
Вы можете получить доступ к элементу, как это arr.0, arr.1... Другое решение: написать свой собственный шаблон тега arr|array_item: "0" или что-то вроде этого.
Рфоника

1
@rphonika Да, пример здесь: stackoverflow.com/a/29664945/2714931
WeizhongTu

Ответы:


304

Помните, что точечная нотация в шаблоне Django используется для четырех разных нотаций в Python. В шаблоне foo.barможет означать любое из:

foo[bar]       # dictionary lookup
foo.bar        # attribute lookup
foo.bar()      # method call
foo[bar]       # list-index lookup

Он пробует их в этом порядке, пока не найдет совпадение. Таким образом, foo.3вы получите свой индекс списка, потому что ваш объект не является dict с 3 в качестве ключа, не имеет атрибута с именем 3 и не имеет метода с именем 3.


3
Разве первый и последний больше не похожи foo['bar']?
Боб Стейн

2
Кажется, нет никакого способа получить доступ к элементу списка, используя переменный индекс :(
Вики Чиджвани

Согласитесь с @VickyChijwani: четвертый вариант выше недействителен. Шаблоны Django, похоже, не выполняют поиск в индексе по списку с переменными
ehacinom

@hiyume Как это преодолеть?
Чаба Тот

Я не понимаю, что я не смог найти это в официальной документации. Не могли бы вы предоставить источник для этого поста? Я также поражен, как этот ответ не принят в настоящее время.
Касзанас

149
arr.0
arr.1

и т.п.


11
как печатать динамически, как например: arr.variablename
Nandha Kumar

Есть ли способ сделать это без магических чисел? Другими словами, чтобы «назвать» .0 .1 .2 и т.д ...? Например, массив ["имя"], массив ["фамилия"] и т. Д.
cyberjoac

@cyberjoac в этом случае использовать dict. В представлении: d = {'first_name': 'foo', 'last_name': 'bar'}. В шаблоне {{d.first_name}} будет работать просто отлично.
Офри Равив


7

Когда вы renderзапросите coctextнекоторую информацию: for exampel:

return render(request, 'path to template',{'username' :username , 'email'.email})

Вы можете получить к нему доступ по шаблону, например так: for variabels :

{% if username %}{{ username }}{% endif %}

for array :

{% if username %}{{ username.1 }}{% endif %}
{% if username %}{{ username.2 }}{% endif %}

Вы также можете называть объекты массива views.pyи использовать его как:

{% if username %}{{ username.first }}{% endif %}

если есть другая проблема, я хочу помочь вам

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.