Vue d'ensemble

Django 1.8, publié le 1er avril 2015, introduit le support de plusieurs moteurs de templates au sein d'un même projet. Il est désormais possible d'utiliser Jinja2 en complément ou en remplacement du moteur de templates natif de Django. Cette version apporte également les nouvelles expressions de requête (Query Expressions) et un middleware de sécurité renforcé.

Fonctionnalités principales

Support multi-moteurs de templates

Le réglage TEMPLATES remplace les anciens réglages de templates et permet de configurer un ou plusieurs moteurs. Chaque moteur peut avoir ses propres répertoires de templates et ses options spécifiques.

python
# settings.py
TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': ['templates/django'],
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
            ],
        },
    },
    {
        'BACKEND': 'django.template.backends.jinja2.Jinja2',
        'DIRS': ['templates/jinja2'],
        'OPTIONS': {
            'environment': 'monprojet.jinja2.environment',
        },
    },
]

Expressions de requête

Les nouvelles expressions de requête permettent de réaliser des calculs directement en base de données avec les objets F(), Value(), Func() et Case/When. Ces expressions sont composables et évitent de rapatrier les données en Python pour effectuer les calculs.

python
from django.db.models import F, Value, Case, When, CharField

# Mise à jour en base sans charger les objets en Python
Produit.objects.filter(en_promotion=True).update(
    prix=F('prix') * 0.9  # Réduction de 10 %
)

# Expression conditionnelle avec Case/When
commandes = Commande.objects.annotate(
    statut_label=Case(
        When(statut='P', then=Value('En attente')),
        When(statut='E', then=Value('Expédiée')),
        When(statut='L', then=Value('Livrée')),
        default=Value('Inconnu'),
        output_field=CharField(),
    )
)

Sources