Quoi de neuf  dans
Django 5.0?

Mainstream support Extended support
3.2 LTS Déc. 2021 Avr. 2024
4.1 Avr. 2023 Déc. 2023
4.2 LTS Déc. 2023 Avr. 2026
5.0 Aoû. 2024 Avr. 2025

✨ Fin du support ✨ de Python 3.8 et 3.9

🪩 Facettes dans l’admin 💃🕺

ModelAdmin.show_facets

Simplification du rendu des formulaires

Avant

<form>
...
<div>
  {{ form.name.label_tag }}
  {% if form.name.help_text %}
    <div class="helptext" id="{{ form.name.auto_id }}_helptext">
      {{ form.name.help_text|safe }}
    </div>
  {% endif %}
  {{ form.name.errors }}
  {{ form.name }}
  <div class="row">
    <div class="col">
      {{ form.email.label_tag }}
      {% if form.email.help_text %}
        <div class="helptext" id="{{ form.email.auto_id }}_helptext">
          {{ form.email.help_text|safe }}
        </div>
      {% endif %}
      {{ form.email.errors }}
      {{ form.email }}
    </div>
    <div class="col">
      {{ form.password.label_tag }}
      {% if form.password.help_text %}
        <div class="helptext" id="{{ form.password.auto_id }}_helptext">
          {{ form.password.help_text|safe }}
        </div>
      {% endif %}
      {{ form.password.errors }}
      {{ form.password }}
    </div>
  </div>
</div>
...
</form>

Après

<form>
...
<div>
  {{ form.name.as_field_group }}
  <div class="row">
    <div class="col">{{ form.email.as_field_group }}</div>
    <div class="col">{{ form.password.as_field_group }}</div>
  </div>
</div>
...
</form>

Ça se configure…

from django.forms.renderers import TemplatesSetting


class CustomFormRenderer(TemplatesSetting):
    field_template_name = "field_snippet.html"

Au niveau global

class MyForm(forms.Form):
    subject = forms.CharField(template_name="my_custom_template.html")

Au niveau du champ

def index(request):
    form = ContactForm()
    subject = form["subject"]
    context = {"subject": subject.render("my_custom_template.html")}
    return render(request, "index.html", context)

Au niveau de la requête

Valeurs par défaut au niveau de la base de données

class MyModel(models.Model):
    created = models.DateTimeField(db_default=Now())

Champs de modèles avec valeurs générées

from django.db import models
from django.db.models import F


class Square(models.Model):
    side = models.IntegerField()
    
    area = models.GeneratedField(
        expression=F("side") * F("side"),
        output_field=models.BigIntegerField(),
        db_persist=True,
    )

⚠️ Uniquement des valeurs déterministes

⚠️ Pas de valeurs d’autres modèles

⚠️ Pas de référence à d’autres champs calculés

Plus d’options pour les "choices"

class Tag(models.Model):
    VISIBILITY_INTERNAL = "internal"
    VISIBILITY_PUBLIC = "public"
    VISIBILITY_CHOICES = [
        (VISIBILITY_INTERNAL, _("Internal")),
        (VISIBILITY_PUBLIC, _("Public")),
    ]
    visibility = models.Charfield(max_length=20, choices=VISIBILITY_CHOICES)
class VisibilityChoices(models.TextChoices):
    internal = "internal", _("Internal")
    public = "public", _("Public")
    
    
class Tag(models.Model):
    visibility = models.Charfield(max_length=20, choices=Visibility.choices)
VISIBLITY_CHOICES = {
  "internal": _("Internal"),
  "public": _("Public"),
}
    
    
class Tag(models.Model):
    visibility = models.Charfield(max_length=20, choices=VISIBILITY_CHOICES)

Django 5

def get_order_choices():
    return [(value, str(value)) for value in range(10)]
    
    
class Tag(models.Model):
    order = models.IntegerField(choices=get_order_choices)

Django 5

✨ C’est tout pour aujourd’hui! ✨

Made with Slides.com