格式本地化

概述

Django的格式化系统能够使用为当前格式指定的格式在模板中显示日期、时间和数字。 locale . 它还处理窗体中的本地化输入。

访问相同内容的两个用户可能会看到日期、时间和数字以不同的方式格式化,这取决于他们当前区域设置的格式。

备注

要启用带千位分隔符的数字格式,必须设置 USE_THOUSAND_SEPARATOR = True 在您的设置文件中。或者,您可以使用 intcomma 若要格式化模板中的数字,请执行以下操作。

备注

有一个相关的 USE_I18N 控制Django是否应激活翻译的设置。看见 翻译 了解更多详细信息。

表单中支持区域设置的输入

启用格式设置后,Django可以在表单中分析日期、时间和数字时使用本地化格式。这意味着,当猜测用户在表单上输入数据时使用的格式时,它会针对不同的区域尝试不同的格式。

备注

Django使用不同的格式将数据显示给它用来解析数据的那些格式。最值得注意的是,用于分析日期的格式不能使用 %a (工作日简称) %A (工作日全名) %b (缩写月份名称) %B (全名),或 %p (AM/PM)。

要使窗体字段能够本地化输入和输出数据,请使用 localize 论点:

class CashRegisterForm(forms.Form):
    product = forms.CharField()
    revenue = forms.DecimalField(max_digits=4, decimal_places=2, localize=True)

控制模板中的本地化

每当Django在模板中输出值时,它都会尝试使用区域设置特定的格式。

但是,使用本地化值可能并不总是合适的——例如,如果您输出的是设计为机器可读的JavaScript或XML,那么您将始终需要未本地化的值。您可能还希望在选定的模板中使用本地化,而不是在任何地方使用本地化。

为了更好地控制本地化的使用,Django提供了 l10n 包含以下标记和筛选器的模板库。

模板标签

localize

启用或禁用所包含块中模板变量的本地化。

要激活或停用模板块的本地化,请使用:

{% load l10n %}

{% localize on %}
    {{ value }}
{% endlocalize %}

{% localize off %}
    {{ value }}
{% endlocalize %}

localizeunlocalize 对于将在每个变量基础上执行相同工作的模板筛选器。

模板筛选器

localize

强制本地化单个值。

例如:

{% load l10n %}

{{ value|localize }}

要禁用单个值的本地化,请使用 unlocalize . 要控制模板大部分的本地化,请使用 localize 模板标签。

unlocalize

强制打印单个值而不进行本地化。

例如:

{% load l10n %}

{{ value|unlocalize }}

要强制本地化单个值,请使用 localize . 要控制模板大部分的本地化,请使用 localize 模板标签。

返回未定标数值的字符串表示形式 (intfloatDecimal

创建自定义格式文件

Django为许多地区提供了格式定义,但有时您可能希望创建自己的格式定义,因为您的地区不存在格式文件,或者您希望覆盖某些值。

要使用自定义格式,请指定首先放置格式文件的路径。为此,设置 FORMAT_MODULE_PATH 设置为将存在格式文件的包,例如:

FORMAT_MODULE_PATH = [
    "mysite.formats",
    "some_app.formats",
]

文件不直接放在此目录中,而是放在名为区域设置的目录中,并且必须命名为 formats.py . 注意不要在这些文件中放置敏感信息,因为如果将字符串传递给 django.utils.formats.get_format() (由 date 模板过滤器)。

要定制英文格式,需要这样的结构:

mysite/
    formats/
        __init__.py
        en/
            __init__.py
            formats.py

在哪里? formats.py 包含自定义格式定义。例如::

THOUSAND_SEPARATOR = "\xa0"

使用不间断空格(Unicode 00A0 )作为千位分隔符,而不是默认的英文逗号。

提供的区域设置格式的限制

有些区域设置使用数字的上下文相关格式,Django的本地化系统无法自动处理这些格式。

瑞士(德语)

瑞士数字格式取决于正在格式化的数字类型。对于货币值,逗号用作千位分隔符,小数点用作小数点分隔符。对于所有其他数字,逗号用作十进制分隔符,空格用作千位分隔符。Django提供的区域设置格式使用通用分隔符、逗号表示小数,空格表示千位分隔符。