2013-07-15 12 views
6

Robię aplikację Django z arkuszem wydatków i utknąłem, próbując renderować sumę wszystkich wprowadzonych wydatków.Wywołanie funkcji menedżera niestandardowego w szablonach django

I utworzeniu niestandardowego menedżera obliczyć sumę:

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

I dodaje go do mojego modelu

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

wiem, że mój kierownik działa, ponieważ kiedy go wykonać w powłoce Dostaję poprawną sumę moich wydatków - tj. Wstawiam Expense.price_object.price_sum() i otrzymuję zwrot Decimal('254.77') - ale kiedy próbuję wprowadzić to do mojego szablonu, po prostu pokazuje się puste.

Próbowałem oddanie w moim zmiennej kilka różnych sposobów, ale żaden z nich pracował, na przykład:

{{price_object.price_sum}} 

lub

{{expense.price_object.price_sum}} 

albo ja zdesperowany ...

lub

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

ale tak ... nic nie pojawia się po załadowaniu strony. Czy ktoś może pomóc?

Odpowiedz

1

Spróbuj określić metodę menedżera tak:

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

Właśnie spróbowałem i to oblicza sumę w szablonie dla mnie.

+0

jak nazwałeś to w szablonie? – sha256

+0

@ sha256, Podobnie jak w odpowiedzi Daniela Rosemana, wystarczy przekazać obiekt klasy Model do szablonu. – dragoon

+0

+1 do obu anwsers. pomocna – sha256

1

Żaden z przykładów szablonów nie wydaje się być równoważny z tym, co zrobiłeś w powłoce. W powłoce nazwałaś poprawnie menedżera z klasy modelu, Expense. Dokładnie to też musisz zrobić z szablonu. Nie możesz wywołać tego z instancji modelu, tylko z klasy i zakładam, że posiadana przez ciebie nazwa expense jest instancją. Konieczne będzie przekazanie klasy samej w sobie do kontekstu szablonu.

+0

Przepraszam, jeśli to jest podstawowe, ale w jaki sposób przekazujesz samą klasę? obecnie moim zdaniem przekazuję 'all_expenses = Expense.objects.all()' jako kontekst jako '{'expenses': all_expenses}' (zmieniłem zmienną z wydatków na wydatki, ponieważ uwzględnia ona wszystkie wydatki zamiast jednego więc nie stanowi to problemu w porównaniu z tym, co udostępniłem powyżej). – skscharr

+0

Klasa to obiekt, jak wszystko inne. Możesz przekazać to dokładnie w taki sam sposób: '{'Expense': Expense}'. –

Powiązane problemy