Как получить сумму значений в шаблоне Django для цикла или как я могу реализовать то же самое в представлении Django

это мой шаблон

<div class="row m-5 p-3 border bg-white">
    <table class="table ">
        <tr>
            <th>Project Name</th>
            <th>Total Partnership</th>
        </tr>
        {% for pages in page %}
        <tr>
            <td>{{pages.name}}</td>
            
            <td>
                {% for i in pages.partnership_set.all %}
                {{i.partnership}}%
                
                {% endfor%}
            </td> 
        </tr>
        {% endfor %}
    </table>
   
</div>

Моя точка зрения такова:

def fnviewproject(request):
projects=project.objects.all()
paginator=Paginator(projects,3)
page_num=request.GET.get('page')
page_obj=paginator.get_page(page_num)
context={'page':page_obj}
return render(request,"viewproject.html",context)

Мой вывод: | Название проекта | Полное партнерство |-------------|-------------------| |проект 1. | |Project 2. 20% 30% 40%. | |project 3. |

Я просто хочу, чтобы это общее партнерство было добавлено и отображено. Как я могу сделать это либо в шаблоне, либо в представлении?

Вы можете создать пользовательский тег templatetag, если хотите, чтобы обработка выполнялась в шаблоне.

project_dir/app_name/templatetags/sometag.py

from django import template

register = template.Library() 

@register.filter
def total_percentage(value):
    temp_val = value.split(' ')
    percentage = 0
    
    for val in temp_val:
        percentage += int(val[:-1])

    return str(percentage) + '%'

Затем вызовите его в вашем шаблоне следующим образом:

{% load sometag %}
{% total_percentage i.partnership %}

Разработчики Django придерживались мнения, что шаблоны предназначены для представления данных. Бизнес-логика должна быть реализована в коде Python. "Мнение". Поэтому вы не можете легко и естественно создавать итоги в шаблоне, только отображать их.

Вы не показываете свои модели, но если я правильно догадался, вы хотите, чтобы каждый pages отображал количество объектов в partnership_set? Если да, то вы можете получить это непосредственно из базы данных с помощью аннотации queryset (например, cheat sheet пример 6)

project = Project.objects.all().annotate(
    total_partnerships = Count('partnership')
)

Затем в вашем шаблоне

{{ pages.total_partnerships }}

Для чего-то более сложного вы можете написать функцию Python для ее вычисления, и либо вызвать ее и передать результат через ваш контекст в шаблон, либо прикрепить ее к соответствующей модели как свойство:

class Something (models.Model):
    ...

    @property
    def foo_value( self):
       # calculate value based on model instance represented by self
       return value

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

{{ something.foo_value}}

Кстати, ваш код будет лучше, если вы будете придерживаться соглашений Django. Классы моделей начинаются с заглавных букв Project, а не с project. Экземпляр класса не начинается, поэтому вы можете естественно писать project = Project( field=value, ...) или projects = Project.objects.all(). Также старайтесь использовать осмысленные имена переменных. page не очевидно.

Вернуться на верх