Подтвердить что ты не робот

Доступ к dict по переменной в шаблонах Django?

Мой код выглядит так:

context = Context() 
context['my_dict'] = {'a': 4, 'b': 8, 'c': 15, 'd': 16, 'e': 23, 'f': 42 }
context['my_list'] = ['d', 'f', 'e', 'b', 'c', 'a']

И что я хотел бы сделать в моем шаблоне Django:

<ul>
{% for item in my_list %} 
  <li>{{ item }} : {{ my_dict.item }}</li>
{% endfor %} 
</ul>

И я бы хотел, чтобы это выводило:

<ul> 
  <li> d : 16 </li> 
  <li> f : 42 </li> 
  <li> e : 23 </li> 
  <li> b : 8 </li> 
  <li> c : 15 </li> 
  <li> a : 4 </li> 
</ul> 

Но ссылка на dict по имени переменной через {{ my_dict.item }} фактически не работает. Я подозреваю, что он внутренне выполняет my_dict['item'] вместо my_dict[item]. Есть ли способ обойти это?

4b9b3361

Ответ 1

Нет встроенного способа сделать это, вам нужно написать простой фильтр шаблонов, чтобы сделать это: http://code.djangoproject.com/ticket/3371

Ответ 2

Вот пример использования предлагаемого ответа.

В этом примере я создал общий шаблон для вывода табличных данных из представления. Мета-данные о столбцах хранятся в контексте [ "columnMeta" ].

Поскольку это словарь, я не могу полагаться на клавиши для вывода столбцов по порядку, поэтому для этого у меня есть ключи в отдельном списке.

На моем view.py:


c["columns"] = ["full_name","age"]
c["columnMeta"] = {"age":{},"full_name":{"label":"name"}}

В моем файле templatetags:


@register.filter
def getitem ( item, string ):
  return item.get(string,'')

В моем шаблоне:

<tr>
<!-- iterate columns in order specified -->
{% for key in columns %}
<th>
 <span class="column-title">
    <!-- look label in meta dict.  If not found, use the column key -->
   {{columnMeta|getitem:key|getitem:"label"|default:key}}
  </span>
</th>
{% endfor %}</tr>

Ответ 4

Для моих нужд мне нужен единственный фильтр шаблонов, который будет работать для dicts, lists и tuples. Итак, вот что я использую:

@register.filter
def get_item(container, key):
    if type(container) is dict:
        return container.get(key)
    elif type(container) in (list, tuple):
        return container[key] if len(container) > key else None
    return None