Суммирование значений для каждой строки в таблице, динамически генерируемой из контекстных переменных django

В моем шаблоне есть следующая таблица:

<tbody>
        {% for user in users %}
            <tr>
                <td>{{ user.title }} </td>
                {% for fruit in fruits %}
                    {{ sum|add:user|get_attr:fruit }}
                        <td>{{ user|get_attr:fruit }} </td>
                {% endfor %}
                {% for vegetable in vegetables %}
                    {{ sum|add:user|get_attr:vegetable }}
                        <td>{{ user|get_attr:vegetable }} </td>
                {% endfor %}
            <td>{{ sum }}</td>
        {% endfor %}
</tbody>

"фрукты" и "овощи" - это списки, переданные в качестве контекста из представления. Следующий пользовательский фильтр позволяет мне итерацией по этим спискам извлекать целочисленные значения из модели "user". Столбцы таблицы генерируются таким же образом, поэтому этот фильтр должен быть в таблице:

@register.filter
def get_attr(obj, attr):
    return getattr(obj, attr)  

Переменная "sum" передается как контекст из представления со значением 0. Я пытаюсь заставить ее суммировать все соответствующие переменные строки в шаблоне, но она остается равной 0. Насколько я могу судить, есть три пути решения этой проблемы:

  1. Solve this in the template (as I'm trying now)
  2. Generate the value in the view (although I have no idea how I would go about this)
  3. Add some JS to solve it (would prefer to avoid this).

Как я должен решить эту проблему?

Решил эту проблему на задней стороне, создав словарь:

views.py

sum = {}
for user in users:
    identity = user.pk
    score = 0
    all_food = fruits + vegetables
    for food in all_food:
        score += getattr(user,food)
    sum[identity] = score

Теперь к суммированному значению можно получить доступ в шаблоне, используя другой пользовательский тег шаблона:

@register.filter
def get_value(dictionary, key):
    return dictionary.get(key)

Добавление в шаблон:

{{ sum|get_value:user.pk }}
Вернуться на верх