Как получить доступ к вложенным полям 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>