django模板中的乘法而不使用手动创建的模板标签

Posted

技术标签:

【中文标题】django模板中的乘法而不使用手动创建的模板标签【英文标题】:multiplication in django template without using manually created template tag 【发布时间】:2013-08-23 10:10:21 【问题描述】:

我想在django模板中实现乘法运算。例如 我有价值观, 价格=10.50 数量=3

在这个链接的帮助下

http://slacy.com/blog/2010/07/using-djangos-widthratio-template-tag-for-multiplication-division/

我尝试了以下代码来实现它,

% widthratio quantity 1 price %

但它只返回 31。但我需要浮点数 (31.5) 中的答案

我想在不使用手动创建的标签的情况下实现它

我怎样才能实现它? 提前谢谢...

【问题讨论】:

计算视图中的结果。他们没有为模板实现这样的标签是有原因的。 所以你说在django模板中没有办法做乘法? 你总是使用custom filter。 无论如何感谢好友的更新............ 添加了答案。我的意思是“你可以总是使用自定义过滤器”,抱歉。 【参考方案1】:

您可以使用内置的widthratio 模板标签。

a*b 使用% widthratio a 1 b % a/b 使用% widthratio a b 1 %

注意:结果在返回之前会四舍五入为整数。

@见https://docs.djangoproject.com/en/dev/ref/templates/builtins/

【讨论】:

不能访问主号码而不是int?【参考方案2】:

有两种方法:

计算视图内的值并将它们传递给模板(我认为推荐) 使用模板过滤器

addfilter 的方式,您始终可以创建自己的multiply 过滤器,创建自己的custom filter:

from django import template

register = template.Library()

@register.filter
def multiply(value, arg):
    return value * arg

然后在您的模板中,类似的东西应该可以工作。

 quantity | multiply:price 

这未经测试,我也从未这样做过,因为我发现在视图中计算数据并使用模板呈现更简洁。

【讨论】:

这意味着我必须使用自定义过滤器..好的,谢谢哥们..我会去的。 如果该答案对您有帮助,请不要忘记标记为已回答。【参考方案3】:

我使用的另一种方法对我来说似乎更干净。如果您正在浏览查询集,则计算视图中的值是没有意义的。相反,将计算作为函数添加到模型中!

假设您的模型如下所示:

Class LineItem:
    product = models.ForeignKey(Product)
    quantity = models.IntegerField()
    price = models.DecimalField(decimal_places=2)

只需将以下内容添加到模型中:

    def line_total(self):
        return self.quantity * self.price

现在您可以简单地将 line_total 视为记录中的一个字段:

 line_item.line_total 

这使得line_total 值可以在任何地方使用,无论是在模板还是视图中,并确保它始终保持一致,而不会占用数据库中的空间。

【讨论】:

同意这是一个更一致的解决方案,但我认为问题是试图为您无权访问的模型找到一些模板端解决方案。【参考方案4】:

我知道这个问题问世已经很久了,但是现在有一个名为 django-mathfilters 的库,它使 Django 模板中的数学运算变得更容易。你可以很容易地写 <li>42 * 0.5 = answer|mul:0.5 </li> 用于乘法。

看看https://pypi.org/project/django-mathfilters/

【讨论】:

以上是关于django模板中的乘法而不使用手动创建的模板标签的主要内容,如果未能解决你的问题,请参考以下文章

如何为 django 模板中的标签创建动态 id

处理 django 包含模板标签中的请求

Django 模板标签中的相同结果

在 Django 中自定义模板标签以过滤博客中的特色帖子

从字符串而不是从文件加载模板

在Django中自定义模板标签以过滤博客中的featured_posts