Django - 将变量从模板传递给Manager

时间:2017-12-13 02:13:02

标签: django

我正在建立自己的预算应用程序。我正在使用此经理:

class AccountMonthlyManager(MonthlyCalculationManager):

    def transactions(self, date_str):
        date = get_this_month_and_year(date_str)
        entries = self.related_set().filter(date__month=date[0], date__year=date[1]).aggregate(total=Sum('amount'))
        return entries.get('amount', 0)

以及此模型:

class Account(models.Model):
    begin = models.FloatField()
    weekly_change = models.FloatField()
    fixed_value = models.FloatField(null=True)
    income = models.BooleanField(default=False)
    monthly = AccountMonthlyManager()
    objects = models.Manager()

我想在模板中显示每个帐户的所有交易总额,如下所示:

{% for account in view.budget_accounts %}
<tr class="dataLine budget" data-id="{{ account.id }}">
    <td>{{ account.label }}</td>
    <td>{{ account.monthly.transactions }}</td>
</tr>
{% endfor %}

但是,经理需要一个日期字符串,该字符串位于我的网址中。

url(r'^budgets/(?P<slug>[^/]+)/$', views.BudgetView.as_view(), name="budgets"),

我正在寻找一种方法来实现这一点,并没有让我为了这个目的而用大量代码重载我的视图。现在,我所做的就是:

def budget_accounts(self):
    return Account.objects.filter(income=False, fixed_value=None)

我需要一种方法将此url字符串返回给管理器,因此它可以提供正确的总数!

1 个答案:

答案 0 :(得分:1)

你的urls.py是什么?您应该能够在网址中添加参数,以便从/budgets/2017-12/转换为view_budgets(monthyear)之类的内容。基于Django URL Dispatcher的样本,您应该可以执行以下操作:

url(r'^budget/([0-9]{4})-([0-9]{2})/$', views.budget),

并将budget()函数更改为:

def budget(request, year, month):

或类似的。不确定如何将模板放入budget_accounts中,因此我不确定这是否真的是您的显示视图功能。但是urls.py是关键而且功能非常强大 - 如果你使用它,那么你可以拥有一个在GET上从未有任何传统参数的大型网站 - 仅用于安全目的(并且可能是为了防止URL变得太长)和POST。