Django的格式化系統(tǒng)可以在模板中使用當(dāng)前地區(qū)特定的格式,來展示日期、時(shí)間和數(shù)字。也可以處理表單中輸入的本地化。
當(dāng)它被開啟時(shí),訪問相同內(nèi)容的兩個(gè)用戶可能會(huì)看到以不同方式格式化的日期、時(shí)間和數(shù)字,這取決于它們的當(dāng)前地區(qū)的格式。
格式化系統(tǒng)默認(rèn)是禁用的。需要在你的設(shè)置文件中設(shè)置USE_L10N = True
來啟用它。
注意
為了方便起見,django-admin startproject創(chuàng)建的默認(rèn)的
settings.py文件包含了
[
USE_L10N = True](../../ref/settings.html#std:setting-USE_L10N) 的設(shè)置。
但是要注意,要開啟千位分隔符的數(shù)字格式化,你需要在你的設(shè)置文件中設(shè)置USE_THOUSAND_SEPARATOR = True
?;蛘?,你也可以在你的模板中使用intcomma
來格式化數(shù)字。
注意
USE_I18N
是另一個(gè)獨(dú)立的并且相關(guān)的設(shè)置,它控制著Django是否應(yīng)該開啟翻譯。詳見翻譯。
格式化開啟之后,Django可以在表單中使用本地化格式來解析日期、時(shí)間和數(shù)字。也就是說,在表單上輸入時(shí),它會(huì)嘗試不同的格式和地區(qū)來猜測(cè)用戶使用的格式。
注意
Django對(duì)于展示數(shù)據(jù),使用和解析數(shù)據(jù)不同的格式。尤其是,解析日期的格式不能使用%a
(星期名稱的縮寫),%A
(星期名稱的全稱),%b
(月份名稱的縮寫), %B
(月份名稱的全稱),或者%p
(上午/下午)。
只是使用localize
參數(shù),就能開啟表單字段的本地化輸入和輸出:
class CashRegisterForm(forms.Form):
product = forms.CharField()
revenue = forms.DecimalField(max_digits=4, decimal_places=2, localize=True)
當(dāng)你使用USE_L10N
來開啟格式化的時(shí)候,Django會(huì)嘗試使用地區(qū)特定的格式,無論值在模板的什么位置輸出。
然而,這對(duì)于本地化的值不可能總是十分合適,如果你在輸出JavaScript或者機(jī)器閱讀的XML,你會(huì)想要使用去本地化的值。你也可能想只在特定的模板中使用本地化,而不是任何位置都使用。
DJango提供了l10n
模板庫(kù),包含以下標(biāo)簽和過濾器,來實(shí)現(xiàn)對(duì)本地化的精細(xì)控制。
在包含的代碼塊內(nèi)開啟或關(guān)閉模板變量的本地化。
這個(gè)標(biāo)簽可以對(duì)本地化進(jìn)行比USE_L10N
更加精細(xì)的操作。
這樣做來為一個(gè)模板激活或禁用本地化:
{% load l10n %}
{% localize on %}
{{ value }}
{% endlocalize %}
{% localize off %}
{{ value }}
{% endlocalize %}
注意
在 {% localize %}
代碼塊內(nèi)并不遵循f USE_L10N
的值。
對(duì)于在每個(gè)變量基礎(chǔ)上執(zhí)行相同工作的模板過濾器,參見localize
和 unlocalize
。
強(qiáng)制單一值的本地化。
例如:
{% load l10n %}
{{ value|localize }}
使用unlocalize
來在單一值上禁用本地化。使用localize
模板標(biāo)簽來在大塊的模板區(qū)域內(nèi)控制本地化。
強(qiáng)制單一值不帶本地化輸出。
例如:
{% load l10n %}
{{ value|unlocalize }}
使用localize
來強(qiáng)制單一值的本地化。使用localize
模板標(biāo)簽來在大塊的模板區(qū)域內(nèi)控制本地化。
Django為許多地區(qū)提供了格式定義,但是有時(shí)你可能想要?jiǎng)?chuàng)建你自己的格式,因?yàn)槟愕牡拇_并沒有現(xiàn)成的格式文件,或者你想要覆寫其中的一些值。
Changed in Django 1.8:
添加了指定FORMAT_MODULE_PATH
為列表的功能。之前只支持單一的字符串值。
指定你首先放置格式文件的位置來使用自定義格式。把你的FORMAT_MODULE_PATH
設(shè)置設(shè)置為格式文件存在的包名來使用它,例如:
FORMAT_MODULE_PATH = [
'mysite.formats',
'some_app.formats',
]
文件并不直接放在這個(gè)目錄中,而是放在和地區(qū)名稱相同的目錄中,文件也必須名為formats.py
。
需要這樣一個(gè)結(jié)構(gòu)來自定義英文格式:
mysite/
formats/
__init__.py
en/
__init__.py
formats.py
其中formats.py
包含自定義的格式定義。例如:
from __future__ import unicode_literals
THOUSAND_SEPARATOR = '\xa0'
使用非間斷空格(Unicode 00A0
)作為千位分隔符,來代替英語中默認(rèn)的逗號(hào)。
一些地區(qū)對(duì)數(shù)字使用上下文敏感的格式,Django的本地化系統(tǒng)不能自動(dòng)處理它。
瑞士的數(shù)字格式化取決于被格式化的數(shù)字類型。對(duì)于貨幣值,使用逗號(hào)作為千位分隔符,以及使用小數(shù)點(diǎn)作為十進(jìn)制分隔符。對(duì)于其它數(shù)字,逗號(hào)用于十進(jìn)制分隔符,空格用于千位分隔符。Django提供的本地格式使用通用的分隔符,即逗號(hào)用于十進(jìn)制分隔符,空格用于千位分隔符。
譯者:Django 文檔協(xié)作翻譯小組,原文:ocalized Web UI formatting and form input。
本文以 CC BY-NC-SA 3.0 協(xié)議發(fā)布,轉(zhuǎn)載請(qǐng)保留作者署名和文章出處。
Django 文檔協(xié)作翻譯小組人手緊缺,有興趣的朋友可以加入我們,完全公益性質(zhì)。交流群:467338606。