在Django模板中调用自定义管理器函数

7

我正在制作一个基于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()
  ...

我知道我的经理是有效的,因为当我在shell中执行它时,我得到了正确的支出总和--即我输入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 %}

但是...当我加载页面时,没有任何内容显示。有人能帮忙吗?


这个问题有解决方案吗?我也遇到了同样的问题。 - Alex Winkler
2个回答

1

尝试像这样定义您的管理器方法:

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

我刚刚尝试了它,它在模板中为我计算了总和。


1
你在模板中怎么称呼它? - sha256
@sha256,就像Daniel Roseman的回答一样,你只需要将一个Model类对象传递给模板即可。 - dragoon

1
没有你的模板示例与你在shell中所做的相同。在shell中,你正确地从模型类Expense中调用了管理器。这正是你需要从模板中做的。你不能从模型实例中调用它,只能从类中调用,我假设你那里的expense名称是一个实例。你需要将类本身传递到模板上下文中。

抱歉如果这很基础,但是如何传递类本身?目前在我的视图中,我将all_expenses = Expense.objects.all()作为上下文传递,如{'expenses':all_expenses}(我将变量从expense更改为expenses,因为它确实涵盖了所有的费用,而不仅仅是一个,所以与我上面分享的内容相比,这不是问题)。 - user2084044
一个类是一个对象,像其他任何东西一样。您可以以完全相同的方式传递它:{'Expense': Expense} - Daniel Roseman

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接