Доступ к элементам массива в шаблоне django - «поле не найдено» из-за ссылок на юникод - PullRequest
1 голос
/ 25 марта 2012

Я пытаюсь получить доступ к элементам массива из шаблона Django, но получаю ошибку «поле * не найдено». Мой синтаксис шаблона выглядит следующим образом:

<h3>Data:</h3>
<table>
    <thead>
    <tr><th> Row[0] </th><th> Row[1] </th><th> Row[2] </th></tr>
    </thead>
    <tbody>
    {% for row in info %}
    <tr>
        <td>{{ row.0 }}</td>
        <td align = 'center'>{{ row.1 }}</td>
        <td align = 'center'>{{ row.2 }}</td>
    </tr>
    {% endfor %}
    </tbody>
</table>

Считывая мою трассировку стека, похоже, проблема в том, что движок шаблонов пытается ссылаться на поля массива, используя юникодные версии индексов; так что:

  • {{ row.0 }} упоминается как row[u'0'], а не row[0]

тем самым вызывая ошибку.

Точная ошибка: Caught ValueError while rendering: field named 0 not found

Это происходит в:

current = context
    try: # catch-all for silent variable failures
        for bit in self.lookups:
            try: # dictionary lookup
==>             current = current[bit]
            except (TypeError, AttributeError, KeyError):
                try: # attribute lookup
                    current = getattr(current, bit)
                except (TypeError, AttributeError):
                    try: # list-index lookup
                        current = current[int(bit)]

Так что это не доходит до того, что он пытается найти список-индекс. С чего бы это?

Ответы [ 2 ]

0 голосов
/ 25 марта 2012

{{row.0}} должно работать. если нет - напишите шаблонный тег со своей собственной логикой для этого:

@register.simple_tag
def get(l, i):
    return l[int(i)]
0 голосов
/ 25 марта 2012

Вы можете использовать вложенные циклы вместо явной индексации элемента:

{% for row in info %}
<tr>
    {% for value in row %}
    <td {% if forloop.counter > 0 %}align = 'center'{% endif %}> {{ value }} </td>
    {% endfor %}
</tr>
{% endfor %}        
...