Вложенные точечные поиски в шаблонах Django

Согласно Книге Django, системные поддержки шаблонной обработки Django вложенные точечные поиски:

Точечные поиски могут быть вложены несколько уровней глубоко. Например, следующее использование в качестве примера {{person.name.upper}}, который переводит в поиск по словарю (человек ['имя']), затем вызов метода (верхний ()): '{{Person.name.upper}} {{person.age}} годы'.

Есть ли гоблины с этим подходом, не широко охваченным в документации? У меня есть проблемы с вложенными точечными поисками - вот минимальный пример:

views.py:

test = [{'foo': [1, 2, 3], 'bar': [4, 5, 6]}, {'baz': [7, 8, 9]}]
ndx = 'bar'
t = loader.get_template('meh.html')
c = Context({'test': test,
             'ndx': ndx,})
return HttpResponse(t.render(c))

Шаблон meh.html:

   {{ test }}
   {{ test.0 }}
   {{ test.0.ndx }}

Получающийся HTML:

[{'foo': [1, 2, 3], 'bar': [4, 5, 6]}, {'baz': [7, 8, 9]}]
 {'foo': [1, 2, 3], 'bar': [4, 5, 6]}

Вложенный поиск ключа словаря в элементе списка ничего не возвращает, когда я ожидаю [4, 5, 6].

J.J.

7
задан J.J. 18 December 2009 в 16:07
поделиться

4 ответа

Я думаю, проблема в том, что вы ожидаете ndx для оценки, когда этого просто не происходит. Вы пробовали вот это:

{{ test.0.bar }}

Я думаю, это подойдет вам.

Есть ли гоблины с таким подходом ...?

Вроде, но вы говорите не о них примерно, и я не думаю, что это из-за вложенности, или, по крайней мере, не становится хуже после того, как вы углубитесь на один уровень . Я имею в виду, что все параметры поиска являются литералами. Это невозможно изменить. Таким образом, хотя вы могли бы разрабатывать собственные теги шаблонов и передавать им литералы или переменные для оценки, вам действительно не повезло, если вы хотите напрямую получить доступ к некоторому члену переменной на основе оцененного значения другого значения. (Вы могли бы написать для этого шаблонный тег, но он не будет работать во всех желаемых ситуациях и, возможно, сложнее, чем стоит.)

Как бы то ни было, это выглядит как довольно преднамеренный аспект языка шаблонов . Я предлагаю вам подумать, как средство доступа должно знать, следует ли читать {{foo.bar}} как foo [bar] или foo ['bar'] ]. Невозможно сделать осмысленное суждение, не усложняя синтаксис, и это то, чего дизайн шаблона django категорически избегает.

9
ответ дан 6 December 2019 в 14:04
поделиться

Чтобы расширить ответ Дэвида, система шаблонов Django не позволяет использовать значение контекстной переменной в качестве ключа. Итак, в вашем примере

{{ test.0.ndx }}

фактически ищет ключ «ndx» в первом элементе контекстной переменной test .

Если вам нужна эта функция, вам потребуется реализовать самостоятельно, как шаблонный фильтр. Этот билет содержит дополнительную информацию, в том числе аргументы разработчиков Django по поводу упущения этой функции и пример реализации шаблона фильтра, который вы ищете.

4
ответ дан 6 December 2019 в 14:04
поделиться

Я бы предложил либо (и я согласен с интерпретацией Дэвида вашей проблемы):

{{ test.0.bar }} # as david mentioned, or

ndx=test[0]['bar'] # in views
{{ ndx }} # in template
1
ответ дан 6 December 2019 в 14:04
поделиться

Дэвид прав: ndx не будет оцениваться для получения ключа, он будет использоваться буквально как ключ. Вы можете определить новый тег шаблона, чтобы делать то, что вы хотите, вот простой: http://www.djangosnippets.org/snippets/1412/

1
ответ дан 6 December 2019 в 14:04
поделиться
Другие вопросы по тегам:

Похожие вопросы: