【问题标题】:How to disable formatting for FloatField in template for Django如何在 Django 模板中禁用 FloatField 的格式设置
【发布时间】:2011-04-02 20:23:39
【问题描述】:

我似乎无法找到这个问题的明确答案,而 django 的 irc 需要对服务进行身份验证...... 所以我的问题是:当您使用 Django 时,如何强制对模板中的 FloatFields 进行某种格式设置?

问题很简单,我需要像这样的简单点分隔数字:42547.34 我最终得到逗号分隔的值......

这是出现问题的模板示例:

{% for point in zone.points.all  %}
  {% if forloop.last %}
    new google.maps.LatLng({{point.latitude|floatformat}},{{point.longitude|floatformat}})
  {% else %} 
    new google.maps.LatLng({{point.latitude|floatformat}},{{point.longitude|floatformat}}),
  {% endif %}
{% endfor %}];

感谢您的宝贵时间。

附:在使用浮动显示正确的管理员生成表单时,我没有这个问题(我的语言环境是 en_US)

【问题讨论】:

  • 请发布显示此问题的最小代码位。另外,您的语言环境设置是什么?它是使用“,”作为小数位的语言环境吗?
  • 这段代码的问题在于它正在编写javascript代码,而逗号真的把一切都搞砸了......

标签: python django templates


【解决方案1】:
{{ float_var|stringformat:"f" }}

【讨论】:

  • 我遇到了同样的问题,这似乎是生成 Javascript 兼容浮点数的最简单解决方案。对于 Django > 1.3,还有新的“localize”/“unlocalize”过滤器:docs.djangoproject.com/en/dev/topics/i18n/localization/…
  • stringformat:"f" 减少到 6 位小数(例如 4.3550434558 变为 4.355043)。 @justinhui 的回答不是(即使用unlocalize)。
  • 我认为下面给出的答案比这更好,更清晰。仅当您还想自定义输出时,这才有用。喜欢只输出两位小数你可以写|stringformat:".2f",但更简单的是只写|safe或确保它不会本地化输出{% load l10n %}然后写|unlocalize
  • 现在我们不仅在 Django 2.x 上,还在 3.x 上,unlocalize 模板过滤器无疑是正确的答案。
【解决方案2】:

您现在可以在不进行本地化的情况下强制打印值。

{% load l10n %}

{{ value|unlocalize }}

取自https://docs.djangoproject.com/en/2.2/topics/i18n/formatting/#std:templatefilter-unlocalize

【讨论】:

  • 感谢您的回答! IMO 这显然是实现必要功能的最直接方法,因为它禁用了 l10n.. 因此,不是通过 l10n 解析字符串然后将其转换回来,而是获得没有模糊的编程数字格式。模板过滤器的作用也很容易理解。最后但同样重要的是,我们不会禁用 html 转义,这应该被视为一个合理的默认设置。
  • 这比选择的答案更清晰。
【解决方案3】:

我在渲染 lat 和 lng 值时遇到问题。 我的解决方案是:

{{ value|safe }}

【讨论】:

  • 如果您不想加载任何额外的过滤器,这是最好的选择。
【解决方案4】:

您需要创建一个custom template filter

from django.template import Library
from django.utils.numberformat import format

register = Library()

@register.filter
def floatdot(value, decimal_pos=4):
    return format(value, ".", decimal_pos)

floatdot.is_safe = True

用法:

{{ float_var|floatdot }}{{ float_var|floatdot:2 }}

【讨论】:

    【解决方案5】:

    您可以使用自定义 formats.py(请参阅 Django 文档中的“Creating custom format files”)并定义 THOUSAND_SEPARATORDECIMAL_SEPARATOR

    THOUSAND_SEPARATOR = ''
    DECIMAL_SEPARATOR = '.'
    

    这是一个全局设置,因此它将影响您网站上显示的所有浮动。而且你必须打开本地化(USE_L10N 在你的 settings.py 中)。

    如果您可以控制模板,则可以简单地删除 floatformat 过滤器。

    编辑:我不确定,但也许你是这个 Django 错误的受害者:#13617。尝试在 settings.py 中关闭本地化支持,看看错误的逗号是否消失:

    USE_L10N = False
    

    如果是这种情况,请查看错误报告中提到的各种解决方法(最简单的方法是在不需要时关闭本地化)。

    【讨论】:

    • 感谢您的回答,但简单地删除过滤器“floatformat”不起作用...我应该添加另一个过滤器吗?
    • 注意:当您的 Django 安装需要语言环境支持时,“转向本地化”并不是真正的解决方案。
    【解决方案6】:

    我也遇到了同样的问题,正如 piquadrat 所说,这是一个与本地化支持相关的烦人错误。将USE_L10N = True 更改为False 解决了这个问题,它应该在 Django 1.3 中修复。

    【讨论】:

      【解决方案7】:

      当为 javascrip 打印一些变量时,最好将它 jsonify。写一个 jsonify 模板标签然后使用

      {{value|jsonify}}
      

      模板标签

      from django.core.serializers import serialize
      from django.db.models.query import QuerySet
      import json
      from django.template import Library
      
      register = Library()
      
      def jsonify(object):
          if isinstance(object, QuerySet):
              return serialize('json', object)
          return json.dumps(object)
      
      register.filter('jsonify', jsonify)
      

      【讨论】:

      • 过滤器无效:'jsonify'
      • 当然我做到了 :-) 但在我发表此评论时,您的回答并未包含对 jsonify 的任何引用。它在 Django 框架中默认不存在。它需要安装外部包 (pypi.python.org/pypi/django-jsonify) 或编写自定义 jsonify 过滤器,您现在刚刚将其包含在更新的答案中。
      • 好的,添加标签
      猜你喜欢
      • 2012-11-18
      • 1970-01-01
      • 2017-06-01
      • 2022-12-17
      • 2015-09-03
      • 2010-11-13
      • 2020-07-27
      • 2011-06-17
      • 2020-10-26
      相关资源
      最近更新 更多