Как получить доступ к вложенным полям JSONField в шаблоне HTML (Django)

У меня есть модель user с полем data, содержащим вложенные данные, например, для одного user это может быть

data = {
      "2020":{"payment_date":"today","amount":600},
      "2021":{"payment_date":"","amount":800}
        }

у модели также есть поле name.

В моем HTML я могу получить доступ к name и data, но мне трудно проникнуть "глубже" в data, чтобы извлечь amount из 2020 и 2021.

Я предполагаю, что могу сделать {{user.data.2020}}, но это не работает. Если сделать {{user.data}}, то действительно отображаются "оставшиеся данные".

Сейчас я попробовал


<div class="media-body">

    <table>
        <tr>
            <th>Name</th>
            <th>2020</th>
            <th>2021</th>
        </tr>
        {% for user in users%}
        <tr>
            <td>{{user.name}}</td>  # works
            <td>{{user.data.2020.amount}}</td> 
            <td>{{user.data.2021.amount}}</td>
        </tr>
        {% endfor %}

    </table>
</div>

но это не работает

В качестве другой идеи вы также можете использовать custom templatetags вместо цикла:

templatetags/dictionary_item.py

from django import template
register = template.Library()


@register.filter
def dictionary_item(dic, itm):
    return dic.get(itm)

А в вашем шаблоне:

{% load dictionary_item %}

<div class="media-body">

    <table>
        <tr>
            <th>Name</th>
            <th>2020</th>
            <th>2021</th>
        </tr>
        {% for user in users%}
        <tr>
            <td>{{user.name}}</td>  # works
            <td>{{user.data|dictionary_item:"2020"|dictionary_item:"amount"}}</td> 
            <td>{{user.data|dictionary_item:"2021"|dictionary_item:"amount"}}</td>
        </tr>
        {% endfor %}

    </table>
</div>
Вернуться на верх