如何在 Django 模板中添加字符

Posted

技术标签:

【中文标题】如何在 Django 模板中添加字符【英文标题】:How to add a character in Django template 【发布时间】:2012-11-18 09:47:19 【问题描述】:

Django 模板语言有很多特点: https://docs.djangoproject.com/en/dev/ref/templates/builtins/?from=olddocs

但是我一直找不到一个。我在 python 中有一个字典,它被发送到 html 文档。

字典:hello = 'a':100, 'b':200, 'c':300, etc:etc

在 HTML 文件中,如果我这样做:a 输出数字 100

现在我想知道,是否可以使用 Django 模板为 100 和所有其他值添加字符。就像一个过滤器,将输出从 100 200 300 etc 变成 10a0 20a0 30a0 etc 甚至 1.00 2.00 3.00 etc。我发现最接近的是添加内置功能 value|add:"2" 所以 4|add:"2" 会给你6

感谢您阅读本文,我将不胜感激!

【问题讨论】:

一般来说,你想给模板“处理”的值,而不是在模板中进行处理。 字,问题是我正在做一个小型网络商店。因此,所有值都必须以美分表示(在服务器和其他东西中)。但是对于客户来说,他们更容易以美元看到它。谢谢你的评论 mmo123,您仍然应该在视图中重新格式化您的数据,而不是模板。我建议向您的模型添加一个为您返回预格式化值的方法,然后您可以像模板中的任何内容一样干净地访问它。 感谢您的建议。我将尝试遍历字典并添加一个“。”每个数字末尾前两位数。 【参考方案1】:

正如上面 cmets 中所述,您确实应该考虑在您的视图或模型中执行此操作(这将是我的偏好)。

例如:

在你的模型中

import locale
locale.setlocale(locale.LC_ALL, '')

class Product(models.Model):
    ...
    price = models.IntegerField(...)   # hundredths of a unit
    ...

    def human_price(self):
        return locale.currency(self.price / 100, grouping=True)

在您的模板中:

 object.human_price 

如果您的产品价格为 1123.14159,那么您的输出将是 1,123.14 英镑(这是英镑,因为我的语言环境是 'en_GB.UTF-8',您的可能不同。

如果你只想要整个部分,你可以使用:

locale.format('%0.0f', self.price / 100, grouping=True)

相反,在本例中这将返回 1,123。

在此处了解有关区域设置的更多信息:http://docs.python.org/2/library/locale.html

【讨论】:

价格应该是整数或小数,而不是浮点数。否则,+1。 感谢您的回复。不过这对我来说太复杂了!最后,我决定将所有价格作为浮点数保存在数据库中。当它们需要提交到刷卡支付时,我只需将它们乘以 100。可能不太理想,但我对 python 的熟练程度不足以理解自定义模板。再次感谢。【参考方案2】:

如果您真的想在模板中执行此操作,可以尝试以下方法:

 % for d in a|make_list %d%if forloop.counter == 1 %.%endif%%endfor%

但这很丑!

我建议编写一个简单的模板过滤器来适当地转换值。

例如:

# sample filter
def todollars(value):
    val = int(value)
    return "%.2f" % val/100.0

在模板中用作:

 a|todollars 

当值为100 时,这将为您提供1.00 的值。

更多关于如何编写、注册模板过滤器的帮助here。

【讨论】:

+1 用于格式化优雅。在重读 my 代码时,我不知道我是在考虑字符串还是整数:-( 谢谢,我会尝试编写这个自定义过滤器。我会让你知道情况如何。 感谢您的帮助!最终,这种方法对于像我这样的菜鸟来说太复杂了:(。我无法创建自定义过滤器。但更重要的是,我发现我可以将所有值作为浮点数存储在 GAE 上。然后当我的服务器需要发送信息以进行条带支付,它将数字乘以100 :) @mrmo123,想知道自定义过滤器失败的原因是什么? 我无法正确安装/注册自定义过滤器。我总是会收到一个错误,上面写着“无效的过滤器:todollars”。网络上关于如何在谷歌应用引擎中实现自定义 django 模板过滤器的大多数文档都是基于 webapp 的。不幸的是,我刚刚将我的 web 应用升级到 webapp2,虽然它与 webapp 高度兼容,但最终阻止了我安装过滤器。【参考方案3】:

问题是我正在做一个小型网络商店。因此,所有值都必须以美分表示(在服务器和其他东西中)。但对于客户来说,以美元为单位会更容易看到它

那么我认为最好的妥协是create a filter:

from django import template
from django.template.defaultfilters import stringfilter

register = template.Library()

@register.filter
@stringfilter
def dollars(value):
    strng = "%d" % value
    return strng[:-2]+'.'+strng[-2:]

并且在模板中,你可以指定

 a|dollars 

【讨论】:

谢谢,我会尝试编写这个自定义过滤器。我会让你知道情况如何。 感谢您的帮助!最终,这种方法对于像我这样的菜鸟来说太复杂了:(。我无法创建自定义过滤器。但更重要的是,我发现我可以将所有值作为浮点数存储在 GAE 上。然后当我的服务器需要发送信息以进行条带支付,它将数字乘以100 :)

以上是关于如何在 Django 模板中添加字符的主要内容,如果未能解决你的问题,请参考以下文章

如何在 django 模板中拆分字符串?

如何在 django 模板中连接字符串?

如何过滤django模板中的特殊字符

Django cloudinary 图像如何在模板 % % 标签中添加 onClick 事件?

如何区分 Django 模板中的列表和字符串

如何向 Django 模型添加额外数据以在模板中显示?