---
title: "本地格式化"
version: 6.1
locale: zh-hans
source: https://docs.djangoproject.com/zh-hans/6.1/topics/i18n/formatting/
canonical: https://djangodocs.dev/zh-hans/6.1/topics/i18n/formatting/
---
# 本地格式化

## 概况

Django 的格式化系统可以在模板中使用指定的格式化工具为当前的 [locale](/zh-hans/6.1/topics/i18n/#term-locale-name) 来显示日期、时间和数字。

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

> **Note**
>
> 要启用千位分隔符的数字格式，必须在你的配置文件中设置 [`USE_THOUSAND_SEPARATOR = True`](/zh-hans/6.1/ref/settings/#std-setting-USE_THOUSAND_SEPARATOR)。另外，你可以使用 [`intcomma`](/zh-hans/6.1/ref/contrib/humanize/#std-templatefilter-intcomma) 在你的模板中格式化数字。

> **Note**
>
> 有一个相关的 [`USE_I18N`](/zh-hans/6.1/ref/settings/#std-setting-USE_I18N) 配置，控制 Django 是否应该激活翻译。更多细节请参见 [翻译](/zh-hans/6.1/topics/i18n/translation/)。

## 表单中感知本地语言环境输入

格式化开启后，当在表单里解析日期、时间和数字时，Django 可以使用本地化格式。这意味着猜测用户在表单上的输入时所使用的格式化时，会对不同语言环境尝试不同的格式化。

> **Note**
>
> 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)
```

### Locale specific helpers

For country specific form fields, validation, and data formats that are not
included in Django itself, consider using the [django-localflavor](https://pypi.org/project/django-localflavor/)
package, which provides localized form fields and utilities for many countries
and regions ([documentation](https://django-localflavor.readthedocs.io/)).

## 在模板中控制本地化

Django 在模板中输出值时会尽量使用与区域设置相关的格式。

然而，使用本地化值可能并不总是合适的——比如，如果你正在输出机器可读的 JavaScript 或 XML ，则始终需要非本地化的值。你也可以在已选的模板里使用本地化，而不是在所有地方使用。

为了更好的控制本地化的使用，Django 提供 `l10n` 模板库，它包含以下的  tags 和 filters。

### 模板标签

#### `localize`

在模板里启用和禁用模板变量本地化。

要在模板块中启用或禁用本地化，请使用：

```html+django
{% load l10n %}

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

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

当本地化被禁用时，将应用 [本地化设置](/zh-hans/6.1/ref/settings/#settings-l10n) 的格式。

查看 [`localize`](#std-templatefilter-localize) 和 [`unlocalize`](#std-templatefilter-unlocalize) 来获取在每个变量基础上执行相同任务的模板过滤器。

### 模板过滤器

#### `localize`

对单一值的强制本地化

例如：

```html+django
{% load l10n %}

{{ value|localize }}
```

对单一值取消本地化，使用 [`unlocalize`](#std-templatefilter-unlocalize) 。要控制大部分模板的本地化，请使用 [`localize`](#std-templatetag-localize) 模板标签。

#### `unlocalize`

强制地让单一值不被本地化。

例如：

```html+django
{% load l10n %}

{{ value|unlocalize }}
```

对单一值强制本地化，使用 [`localize`](#std-templatefilter-localize) 。要控制大部分模板的本地化，请使用 [`localize`](#std-templatetag-localize) 模板标签。

返回应用了 [本地化设置](/zh-hans/6.1/ref/settings/#settings-l10n) 格式的数字（`int`、`float` 或 `Decimal`）的字符串表示。

## 创建自定义的格式化文件

Django 为许多地区提供了格式定义，但有时你可能想创建自己的格式，因为你的地区不存在一个格式文件，或者你想覆盖一些值。

To use custom formats, specify the path where you'll place format files
first. To do that, set your [`FORMAT_MODULE_PATH`](/zh-hans/6.1/ref/settings/#std-setting-FORMAT_MODULE_PATH) setting to the
package where format files will exist, for instance:

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

文件不能直接放置在这个目录里，而是要放在本地语言环境的目录中，而且必须命名为 `formats.py` 。要注意不要在这些文件里放置敏感信息，因为如果你把字符串传递给 `django.utils.formats.get_format()` （使用 [`date`](/zh-hans/6.1/ref/templates/builtins/#std-templatefilter-date) 模板过滤器），那么内部值会被暴露。

要自定义英文格式，需要类似以下结构：

```text
mysite/
    formats/
        __init__.py
        en/
            __init__.py
            formats.py
```

`formats.py` 包含自定义格式化定义。例如：

```
THOUSAND_SEPARATOR = "\xa0"
```

使用不换行空格（硬空格 Unicode `00A0` ）作为千位分隔符，而不是英语的默认逗号。

## 提供本地语言环境格式化的局限性

一些本地语言环境为数字使用上下文相关的格式化，而 Django 本地化系统不能自动处理。

### Switzerland (German, French)

The Swiss number formatting traditionally varies depending on context. For
example, monetary values may use a dot as decimal separator (`Fr. 23.50`),
while measurements often use a comma (`22,5 m`). Django’s localization system
does not support such context-specific variations automatically.

The locale format provided by Django uses the generic separators, a comma for
decimal and a space for thousand separators.
