【问题标题】:Calling custom manager function in django templates在 django 模板中调用自定义管理器函数
【发布时间】:2013-07-13 18:46:14
【问题描述】:

所以我正在制作一个费用表 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 %}

但是是的...当我加载页面时,什么都没有出现。有人可以帮忙吗?

【问题讨论】:

  • 有解决方案吗?有同样的问题

标签: django django-custom-manager


【解决方案1】:

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

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

我刚刚试了一下,它为我计算了模板中的总和。

【讨论】:

  • 你是怎么在模板中调用它的?
  • @sha256,正如 Daniel Roseman 的回答,您只需将 Model 类对象传递给模板。
【解决方案2】:

您的模板示例似乎都不等同于您在 shell 中所做的。在 shell 中,您正确地从模型类 Expense 调用了管理器。这正是您需要从模板中执行的操作。您不能从模型实例中调用它,只能从类中调用它,并且我假设您拥有的 expense 名称是一个实例。您需要将 类本身 传递给模板上下文。

【讨论】:

  • 对不起,如果这是基本的,但是您如何通过课程本身?目前在我看来,我将all_expenses = Expense.objects.all() 作为{'expenses':all_expenses} 的上下文传递(我将变量从费用更改为费用,因为它确实考虑了所有费用而不是一个,因此与我上面分享的内容相比,这不是问题)
  • 一个类是一个对象,就像其他任何东西一样。你可以用完全相同的方式传递它:{'Expense': Expense}.
猜你喜欢
  • 2018-09-07
  • 2021-11-19
  • 2016-03-01
  • 1970-01-01
  • 2013-02-03
  • 2012-08-01
  • 2013-12-04
  • 1970-01-01
相关资源
最近更新 更多