Régionalisation des formats

Aperçu

Le système des formats de Django est capable d’afficher des dates, des heures et des nombres dans les gabarits en utilisant les formats définis pour la langue (locale) active. Il gère également les saisies en formats régionalisés dans les formulaires.

Lorsqu’il est actif, deux utilisateurs accédant simultanément à un même contenu peuvent voir les dates, les heures et les nombres mis en forme différemment, en fonction des formats de leur langue actuelle.

Le système des formats est désactivé par défaut. Pour l’activer, il est nécessaire de définir USE_L10N = True dans votre fichier de réglages.

Note

Le fichier settings.py créé par défaut par django-admin startproject contient USE_L10N = True pour des raisons pratiques. Notez toutefois que pour activer le formatage des nombres avec les séparateurs de milliers, il est nécessaire d’ajouter USE_THOUSAND_SEPARATOR = True dans le fichier des réglages. Une autre manière de le faire est d’utiliser le filtre intcomma pour mettre en forme les nombres dans les gabarits.

Note

Il existe également un réglage différent mais lié nommé USE_I18N qui contrôle l’activation ou non des traductions. Voir Traduction pour plus de détails.

Saisies régionalisées dans les formulaires

Lorsque l’utilisation des formats est active, Django peut utiliser des formats régionalisés lorsqu’il reçoit des dates, des heures et des nombres en provenance de formulaires. Cela signifie qu’il essaie différents formats de différentes langues pour deviner le format utilisé par l’utilisateur lors de saisies de données dans un formulaire.

Note

Django utilise différents formats pour afficher les données que ceux qu’il utilise pour analyser les données reçues. Plus particulièrement, les formats d’analyse de dates ne peuvent pas utiliser %a (jour de la semaine abrégé), %A (jour de la semaine complet), %b (nom du mois abrégé), %B (nom du mois complet) et %p (AM/PM).

Pour qu’un champ de formulaire utilise des formats régionalisés pour mettre en forme ses données affichées et saisies, utilisez simplement son paramètre localize:

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

Contrôle de la régionalisation dans les gabarits

Quand la mise en forme est activée avec USE_L10N, Django essaie d’utiliser des formats spécifiques à la langue lorsqu’il affiche une valeur dans un gabarit.

Cependant, il n’est pas toujours adéquat d’utiliser des valeurs régionalisées, par exemple si vous produisez du JavaScript ou du XML qui devront être interprétés par le système, ce contenu ne devrait jamais contenir d’affichage régionalisé. Il peut aussi être parfois souhaitable de limiter la régionalisation à certains gabarits, plutôt que de l’utiliser partout.

Pour permettre un contrôle plus fin sur l’emploi de la régionalisation, Django propose la bibliothèque de gabarit l10n qui contient les balises et filtres suivants.

Balises de gabarit

localize

Active ou désactive la régionalisation de variables de gabarits dans le bloc qu’elle définit.

Cette balise permet une granularité plus fine dans le choix de régionalisation que le réglage USE_L10N.

Pour activer ou désactiver la régionalisation pour un bloc de gabarit, utilisez :

{% load l10n %}

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

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

Note

La valeur de USE_L10N n’est pas prise en compte à l’intérieur d’un bloc {% localize %}.

Voir aussi localize et unlocalize pour des filtres de gabarit qui font le même travail au niveau des variables.

Filtres de gabarit

localize

Force la régionalisation d’une seule valeur.

Par exemple :

{% load l10n %}

{{ value|localize }}

Pour désactiver la régionalisation d’une seule valeur, utilisez unlocalize. Pour contrôler la régionalisation sur toute une section d’un gabarit, utilisez la balise de gabarit localize.

unlocalize

Force l’affichage d’une seule valeur sans régionalisation.

Par exemple :

{% load l10n %}

{{ value|unlocalize }}

Pour forcer la régionalisation d’une seule valeur, utilisez localize. Pour contrôler la régionalisation sur toute une section d’un gabarit, utilisez la balise de gabarit localize.

Création de fichiers de formats personnalisés

Django fournit des définitions de formats pour de nombreuses langues, mais il peut être parfois souhaitable de créer ses propres formats, soit parce qu’il n’existe pas de fichier de formats pour votre langue, soit par ce que vous souhaitez surcharger certaines valeurs.

Changed in Django 1.8:

La possibilité de définir FORMAT_MODULE_PATH sous forme de liste a été ajoutée. Précédemment, seule une chaîne unique était admise.

Pour utiliser des formats personnalisés, indiquez d’abord le chemin où vous allez placer les fichiers de formats. Pour cela, il suffit d’indiquer dans le réglage FORMAT_MODULE_PATH le chemin du paquet dans lequel seront définis les fichiers de formats ; par exemple :

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

Les fichiers ne sont pas placés directement dans ce répertoire, mais dans un répertoire nommé d’après la locale, et doit s’appeler formats.py. Prenez garde de ne pas mettre d’informations sensibles dans ces fichiers car les valeurs contenues pourraient être exposées si la chaîne est passée à django.utils.formats.get_format() (utilisée par le filtre de gabarit date).

Pour personnaliser les formats anglais, voici à quoi ressemblerait la structure nécessaire :

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

formats.py contient les définitions de formats personnalisés. Par exemple :

from __future__ import unicode_literals

THOUSAND_SEPARATOR = '\xa0'

pour utiliser une espace insécable (Unicode 00A0) comme séparateur de milliers au lieu du caractère par défaut qui est la virgule en anglais.

Limites des formats de langue fournis

Certaines langues utilisent des formats différents selon le contexte pour les nombres, ce que le système de régionalisation de Django ne sait pas gérer automatiquement.

Suisse (alémanique)

Le système de mise en forme des nombres dépend du type de nombre. Pour les valeurs monétaires, c’est la virgule qui doit être utilisée comme séparateur de milliers et le point décimal comme séparateur décimal. Pour tous les autres nombres, la virgule est utilisée comme séparateur décimal et l’espace comme séparateur de milliers. Le format de langue fournit par Django utilise toujours les séparateurs globaux, une virgule comme séparateur décimal et l’espace comme séparateur de milliers.

Back to Top