格式本地化¶
概述¶
Django 的格式化系统能够使用当前区域设置指定的格式在模板中显示日期、时间和数字。它还处理表单中的本地化输入。
两个用户访问相同的内容可能会看到日期、时间和数字以不同的方式格式化,具体取决于其当前区域设置的格式。
注意
要启用带千位分隔符的数字格式化,需要在设置文件中设置USE_THOUSAND_SEPARATOR = True
。或者,您可以使用intcomma
在模板中格式化数字。
表单中的区域设置感知输入¶
启用格式化后,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 %}
{{ value|localize }}
要禁用单个值的本地化,请使用unlocalize
。要控制模板大段内容的本地化,请使用localize
模板标签。
unlocalize
¶
强制不进行本地化地打印单个值。
例如
{% load l10n %}
{{ value|unlocalize }}
要强制本地化单个值,请使用localize
。要控制模板大段内容的本地化,请使用localize
模板标签。
返回数字(int
、float
或 Decimal
)的字符串表示形式,并应用本地化设置 格式。
创建自定义格式文件¶
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 提供的区域设置格式使用通用分隔符,逗号用于小数,空格用于千位分隔符。