Вызов пользовательской функции менеджера в шаблонах Django
Итак, я делаю приложение django для таблицы расходов и пытаюсь отобразить сумму всех введенных расходов.
Я создал собственный менеджер для расчета суммы:
class ExpenseManager(models.Manager):
def price_sum(self):
return super(ExpenseManager, self).aggregate(total_price = Sum('price'))['total_price']
И добавил это к моей модели:
class Expense(models.Model):
...
objects = models.Manager()
price_object = ExpenseManager()
...
Я знаю, что мой менеджер работает, потому что, когда я выполняю его в оболочке, я получаю правильную сумму своих расходов, т.е. Expense.price_object.price_sum()
и я вернусь Decimal('254.77')
- но когда я пытаюсь вставить это в свой шаблон, он просто отображается пустым.
Я попытался вставить в мою переменную пару разных способов, но ни один из них не сработал, например:
{{price_object.price_sum}}
или же
{{expense.price_object.price_sum}}
или я впадаю в отчаяние...
{% for p in expense.price_object %} {{p.price_sum}} {% endfor %}
или же
{% for p in expense.price_object.price_sum %} {{p}} {% endfor %}
но да... ничего не появляется, когда я загружаю страницу. Кто-нибудь может помочь?
2 ответа
Ни один из ваших примеров шаблонов не выглядит эквивалентным тому, что вы делали в оболочке. В оболочке вы правильно вызвали менеджера из модельного класса, Expense
, Это именно то, что вам нужно сделать из шаблона. Вы не можете вызвать его из экземпляра модели, только из класса, и я предполагаю, что expense
имя у вас есть экземпляр. Вам нужно будет передать сам класс в контекст шаблона.
Попробуйте определить свой метод менеджера следующим образом:
class ExpenseManager(models.Manager):
def get_expenses(self):
return super(ExpenseManager, self).get_query_set().aggregate(total_price = Sum('interval'))['total_price']
Я только что попробовал, и он рассчитал сумму в шаблоне для меня.