如何在 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 模板中添加字符的主要内容,如果未能解决你的问题,请参考以下文章