Согласно Книге 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.
Я думаю, проблема в том, что вы ожидаете ndx
для оценки, когда этого просто не происходит. Вы пробовали вот это:
{{ test.0.bar }}
Я думаю, это подойдет вам.
Есть ли гоблины с таким подходом ...?
Вроде, но вы говорите не о них примерно, и я не думаю, что это из-за вложенности, или, по крайней мере, не становится хуже после того, как вы углубитесь на один уровень . Я имею в виду, что все параметры поиска являются литералами. Это невозможно изменить. Таким образом, хотя вы могли бы разрабатывать собственные теги шаблонов и передавать им литералы или переменные для оценки, вам действительно не повезло, если вы хотите напрямую получить доступ к некоторому члену переменной на основе оцененного значения другого значения. (Вы могли бы написать для этого шаблонный тег, но он не будет работать во всех желаемых ситуациях и, возможно, сложнее, чем стоит.)
Как бы то ни было, это выглядит как довольно преднамеренный аспект языка шаблонов . Я предлагаю вам подумать, как средство доступа должно знать, следует ли читать {{foo.bar}}
как foo [bar]
или foo ['bar']
]. Невозможно сделать осмысленное суждение, не усложняя синтаксис, и это то, чего дизайн шаблона django категорически избегает.
Чтобы расширить ответ Дэвида, система шаблонов Django не позволяет использовать значение контекстной переменной в качестве ключа. Итак, в вашем примере
{{ test.0.ndx }}
фактически ищет ключ «ndx»
в первом элементе контекстной переменной test
.
Если вам нужна эта функция, вам потребуется реализовать самостоятельно, как шаблонный фильтр. Этот билет содержит дополнительную информацию, в том числе аргументы разработчиков Django по поводу упущения этой функции и пример реализации шаблона фильтра, который вы ищете.
Я бы предложил либо (и я согласен с интерпретацией Дэвида вашей проблемы):
{{ test.0.bar }} # as david mentioned, or
ndx=test[0]['bar'] # in views
{{ ndx }} # in template
Дэвид прав: ndx
не будет оцениваться для получения ключа, он будет использоваться буквально как ключ. Вы можете определить новый тег шаблона, чтобы делать то, что вы хотите, вот простой: http://www.djangosnippets.org/snippets/1412/