Подведение итогов внутри шаблона Django - PullRequest
3 голосов
/ 20 сентября 2010

У меня есть следующий шаблон в django, я хочу получить итоговые значения за последние 2 столбца для каждого из моих объектов документа

{% for documento in documentos %}
    {% for cuenta in documento.cuentasxdocumento_set.all %}
        <tr {% cycle 'class="gray"' '' %} >
            {% if forloop.first %}
                    <td>{{ documento.fecha_creacion.date }}</td>
                    <td>{{ cuenta.cuenta.nombre }}</td>
                    <td>
                        {% if cuenta.monto >= 0 %}
                            {{ cuenta.monto}}
                        {% endif %}
                    </td>
                    <td>
                        {% if cuenta.monto <= 0 %}
                            {{ cuenta.monto }}
                        {% endif %}
                    </td>
            {% else %}

                    <td colspan="4"></td>
                    <td>{{ cuenta.cuenta.codigo }}</td>
                    <td>{{ cuenta.cuenta.nombre }}</td>
                    <td>
                        {% if cuenta.monto <= 0 %}
                            {{ cuenta.monto }}
                        {% endif %}
                    </td>
                    <td>
                        {% if cuenta.monto >= 0 %}
                            {{ cuenta.monto }}
                        {% endif %}
                    </td>

            {% endif %}
        </tr>
    {% endfor %}
    <tr>
        <td colspan="1"></td>
        <td>Document Total</td>
        <td></td>
        <td></td>
    </tr>
{% endfor %}

Все это делается с использованием следующих моделей, которые упрощены дляЦель этого вопроса

class Documento(models.Model):
    numero_impreso = models.CharField(max_length=50)
    fecha_creacion = models.DateTimeField(auto_now_add = True)


    cuentas = models.ManyToManyField('CuentaContable', through = 'CuentasXDocumento', null = True)

    def __unicode__(self):
        return self.tipo.nombre + ": " + self.numero_impreso

class CuentasXDocumento(models.Model):
    cuenta = models.ForeignKey('CuentaContable')
    documento = models.ForeignKey('Documento')

    monto = models.DecimalField(max_digits= 14, decimal_places = 6)
    linea = models.IntegerField()

class CuentaContable(models.Model):
    codigo = models.CharField(max_length=50)
    nombre = models.CharField(max_length=100)    
    def __unicode__(self):
        return self.nombre

Наконец-то я извиняюсь за плохой английский:)

1 Ответ

2 голосов
/ 20 сентября 2010

Из моего опыта работы с Django я бы сказал, что эти вещи нелегко сделать в шаблоне.Я пытаюсь сделать мои расчеты в представлении вместо шаблона.

Моя рекомендация будет состоять в том, чтобы вычислить две суммы, которые вам нужны в представлении вместо шаблона.шаблон с использованием пользовательских фильтров и тегов .При использовании фильтров это может выглядеть так:

<td>{% documento.cuentasxdocumento_set.all | sum_monto:"pos" %}</td>
<td>{% documento.cuentasxdocumento_set.all | sum_monto:"neg" %}</td>

Фильтры принимают два аргумента: значение, которое вы передаете фильтру, и аргумент, который можно использовать для управления его поведением.Вы могли бы использовать последний аргумент, чтобы сказать sum_monto для суммирования положительных или отрицательных значений.

Это быстрая реализация непроверенного фильтра из головы:

from django import template

register = template.Library()

@register.filter
def sum_monto(cuentas, op):
    if op == "pos":
         return sum(c.monto for c in cuentas if c.monto > 0)
    else
         return sum(c.monto for c in cuentas if c.monto < 0)
...