Вложенные точечные поиски в шаблонах Django - PullRequest
6 голосов
/ 18 декабря 2009

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

Точечный поиск может быть вложен в несколько уровней. Например, в следующем примере используется {{person.name.upper}}, который переводится в поиск по словарю (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:

<code><pre>
   {{ test }}
   {{ test.0 }}
   {{ test.0.ndx }}

Результирующий HTML:

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

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

1026 * J.J. *

Ответы [ 4 ]

8 голосов
/ 18 декабря 2009

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

{{ test.0.bar }}

Я думаю, что это сделает то, что вы ищете.

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

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

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

4 голосов
/ 18 декабря 2009

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

{{ test.0.ndx }}

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

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

1 голос
/ 18 декабря 2009

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

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

ndx=test[0]['bar'] # in views
{{ ndx }} # in template
1 голос
/ 18 декабря 2009

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

...