Вызов пользовательской функции менеджера в шаблонах 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']

Я только что попробовал, и он рассчитал сумму в шаблоне для меня.

Другие вопросы по тегам