2010-09-20 108 views
3

我已經在Django以下模板,我想最後2列的總計爲每個我的文檔中總結對象Django模板

{% 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 

最後我的英語不好:)

回答

2

我與Django的經驗很抱歉,我會說,這些事在模板中不容易完成。我試圖在視圖中而不是模板中進行計算。

我的建議是計算在視圖中需要的兩個總和而不是模板。

衆生說,使用custom filters and tags可以在模板中做一些工作。使用過濾器可能如下所示:

<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) 
+1

謝謝,我不會有過濾器的想,我需要做的是在模板,因爲它是一個任意號碼Documentos – armonge 2010-09-20 18:07:46

+0

任意數量的文檔如何阻止您計算視圖中的總和? – Arlaharen 2010-09-20 19:47:19

+0

我不知道...也許是因爲我是django的noob和更多用於PHP的方式的事情, – armonge 2010-09-20 20:21:04