2013-07-15 12 views
6

Also mache ich eine Spesenabrechnung Django App und ich bin stecken, versuchen, die Summe aller eingegebenen Ausgaben zu rendern.Aufruf benutzerdefinierter Manager-Funktion in Django-Vorlagen

Ich habe einen benutzerdefinierten Manager erstellt die Summe zu berechnen:

class ExpenseManager(models.Manager): 
    def price_sum(self): 
    return super(ExpenseManager, self).aggregate(total_price = Sum('price'))['total_price'] 

Und es zu meiner Modell:

class Expense(models.Model): 
    ... 
    objects = models.Manager() 
    price_object = ExpenseManager() 
    ... 

Ich weiß, dass mein Manager funktioniert, weil, wenn ich es in der Shell ausführen Ich bekomme die korrekte Summe meiner Ausgaben - dh ich gebe Expense.price_object.price_sum() ein und ich bekomme Decimal('254.77') zurück - aber wenn ich versuche, das in meine Vorlage zu bekommen, erscheint es einfach leer.

Ich habe versucht, in meiner Variable verschiedene Möglichkeiten, um ein paar setzen, aber nichts davon hat funktioniert, zum Beispiel:

{{price_object.price_sum}} 

oder

{{expense.price_object.price_sum}} 

oder ich verzweifelt bekommen ...

{% for p in expense.price_object %} {{p.price_sum}} {% endfor %} 

oder

{% for p in expense.price_object.price_sum %} {{p}} {% endfor %} 

aber ja ... nichts erscheint immer wenn ich die Seite lade. Kann jemand helfen?

Antwort

1

Versuchen Sie Ihr Manager Methode wie folgt zu definieren:

class ExpenseManager(models.Manager): 
    def get_expenses(self): 
     return super(ExpenseManager, self).get_query_set().aggregate(total_price = Sum('interval'))['total_price'] 

Ich habe gerade versucht es und es die Summe in einer Vorlage für mich berechnet.

+0

Wie haben Sie es in der Vorlage aufgerufen? – sha256

+0

@ sha256, Wie in Daniel Rosemans Antwort müssen Sie nur ein Model-Klassenobjekt an die Vorlage übergeben. – dragoon

+0

+1 zu beiden anwsers. hilfreich – sha256

1

Keines Ihrer Vorlagenbeispiele scheint dem zu entsprechen, was Sie in der Shell getan haben. In der Shell haben Sie den Manager korrekt aus der Modellklasse Expense aufgerufen. Genau das müssen Sie auch von der Vorlage aus tun. Sie können es nicht von einer Modellinstanz aufrufen, nur von der Klasse, und ich nehme an, dass der expense Name, den Sie dort haben, eine Instanz ist. Sie müssen die Klasse selbst an den Vorlagenkontext übergeben.

+0

Entschuldigung, wenn das grundlegend ist, aber wie übergibt man die Klasse selbst? Zur Zeit übergebe ich 'all_expenses = Expense.objects.all()' als Kontext als '{'expenses': all_expenses}' (Ich habe die Variable von Aufwand zu Aufwand geändert, da sie alle Ausgaben und nicht einen berücksichtigt also das ist kein Problem im Vergleich zu dem, was ich oben geteilt habe) – skscharr

+0

Eine Klasse ist ein Objekt, wie alles andere auch. Sie können es auf genau die gleiche Weise weitergeben: '{'Expense': Expense}'. –

Verwandte Themen