格式本地化

概述

Django 的格式化系统能够使用当前区域设置指定的格式在模板中显示日期、时间和数字。它还处理表单中的本地化输入。

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

注意

要启用带千位分隔符的数字格式化,需要在设置文件中设置USE_THOUSAND_SEPARATOR = True。或者,您可以使用intcomma 在模板中格式化数字。

注意

还有一个相关的USE_I18N 设置,用于控制 Django 是否应激活翻译。有关更多详细信息,请参阅翻译

表单中的区域设置感知输入

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

注意

Django 使用不同的格式来显示数据和解析数据。最值得注意的是,解析日期的格式不能使用%a(缩写的工作日名称)、%A(完整的工作日名称)、%b(缩写的月份名称)、%B(完整的月份名称)或%p(上午/下午)。

要启用表单字段以本地化输入和输出数据,请使用其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 提供的区域设置格式使用通用分隔符,逗号用于小数,空格用于千位分隔符。

返回顶部