Hola.
mmm, me parece un poco confuso su código y realmente no se el contexto en el que lo está haciendo, pero según el pantallazo
puedo ver que vas a tener problemas a futuro por mantenibilidad, tal vez puedas mejorar un poco el código.
Sobre su problema tiene razón es un poco avanzado lo que quieres hacer si lo hace de la forma optimizada, sino la solución más simple es iterar el
conjunto de elemento y realizar la operación (multiplicación y luego suma), pero como django es muy bello, mejor la solución es bonita.
Bueno iniciemos por el principio el modelo.
Models.py hagamos que nuestro código sea compatible con python 2 y 3
from __future__ import unicode_literals
from django.utils.encoding import python_2_unicode_compatible
@python_2_unicode_compatible
class Producto(models.Model):
....
def __str__(self):
return self.nombre
....
A la vista démosle un poco más de poder, igual que TemplateView django tiene ListView* el cual es más adecuado para el tipo de vista
que tienes (revise la documentación para ver que funcionalidades puede aportarle ej paginado, ordenamiento y filtro)
from django.views.generic.list import ListView
from django.db.models import Sum
class MainPanelView(ListView):
model = Producto
def get_context_data(self, **kwargs):
context = super(MainPanelView, self).get_context_data(**kwargs)
context['total_productos'] = context['object_list'].aggregate(Sum('stock'))['stock__sum']
context['total'] = context['object_list'].aggregate(precio_compra__sum = Sum('precio_compra', field='precio_compra * stock'))['precio_compra__sum']
return context
Como verá eliminé varios de los parámetros que le pasa a la vista, esto porque no son necesarios, ya que pueden ser obtenidos desde la template.
la plantilla. Esta está simplificada para no llenar de ruido el correo y solo tiene lo importante
<body>
<ul>
{%for obj in object_list%}
<li>{{obj.codigo}} -- {{obj.precio_compra}} -- {{obj.stock}} -- {{obj.preciototal}} </li>
{%endfor%}
</ul>
<h2> cantidad: {{object_list.count}}</h2>
<h2> total: {{total}}</h2>
</body>
Algo interesante es que por defecto se va a buscar la plantilla en la carpeta
<miapp>/templates/<miapp>/producto_list.html, pero igual como el templateView se puede sobrescribir donde se busca la plantilla.
Saludos.