## Simplifier le développement web dynamique avec [[Django]] et HTMX : Utilisation des Forms et des Serializers {#sec-b233da7ff7c9} Dans notre précédent article, nous avons exploré **comment [[HTMX]] transmet les données au serveur**. **Lire l'article précédent** : [Simplifier le développement web dynamique avec Django et HTMX (Partie 4) : Méthodes de transmission des payloads](/ko/whitedec/2025/1/27/django-htmx-csrf-token-integration/) Alors que la fonction `fetch()` de JavaScript crée et envoie directement des payloads JSON, nous avons constaté que **HTMX se rapproche davantage de la méthode consistant à collecter les valeurs du DOM et à les envoyer comme des données de formulaire**. Cela soulève naturellement la question suivante : **"Quelle est la manière la plus naturelle de valider les données reçues via HTMX dans Django ?"** Au premier abord, beaucoup pourraient penser aux **DRF Serializers**. Il est vrai que les Serializers sont des outils de validation puissants, utilisables même sans JSON. Cependant, lorsqu'on les utilise avec HTMX, on peut ressentir une certaine inadéquation. Pourquoi ? La raison est simple : **le flux de travail de base de HTMX est plus proche de l'univers des formulaires HTML, et Django dispose déjà d'un objet `Form` conçu spécifiquement pour cet univers.** Dans cet article, nous allons explorer **comment utiliser `Django Form` et `DRF Serializer` pour gérer les requêtes HTMX**, et **quelle approche est la plus naturelle et pratique**.  --- ## Les données envoyées par [[HTMX]] sont finalement proches des "données de formulaire" {#sec-8c911eee119a} Comme nous l'avons vu dans le précédent article, HTMX collecte et envoie les valeurs des éléments HTML au serveur. Cela peut se faire en envoyant les valeurs d'entrée d'un `
``` Cet exemple est très simple, mais il illustre bien la synergie entre [[HTMX]] et les formulaires Django. * En cas d'échec, le formulaire entier peut être rendu à nouveau * Les valeurs saisies par l'utilisateur sont conservées * Les messages d'erreur s'affichent naturellement à côté des champs Avec l'approche traditionnelle `fetch()` + JSON + manipulation manuelle du DOM, il aurait fallu écrire beaucoup de JavaScript pour implémenter un tel flux. Cependant, la combinaison HTMX et Django Form permet de gérer cela de manière beaucoup plus simple, en utilisant uniquement le code côté serveur et les templates. --- ## Alors, les Serializers sont-ils inutiles ? {#sec-5f0d93fcd48a} Dire que **les Serializers sont inutiles** serait exagéré. Il serait plus juste de dire : **Il n'est pas nécessaire de choisir les Serializers par défaut.** En réalité, les Serializers de [[DRF]] restent tout à fait attrayants dans les situations suivantes : * Si DRF est déjà largement utilisé dans l'ensemble du projet * Si vous souhaitez réutiliser la même logique de validation pour les API et les écrans rendus côté serveur * Si la logique de validation des entrées est complexe et déjà bien organisée dans un Serializer * Si vous prévoyez d'exposer la même fonctionnalité à des applications mobiles ou des API externes ultérieurement En d'autres termes, la question n'est pas **"Peut-on utiliser un Serializer avec HTMX ?"**, mais plutôt **"Est-ce que l'intégration d'un Serializer ici apporte un avantage significatif à l'architecture globale ?"** --- ## Il est également possible d'utiliser un Serializer {#sec-bfbe9c61b12c} Par exemple, imaginons que vous ayez déjà un Serializer comme celui-ci : ```python from rest_framework import serializers class TodoSerializer(serializers.Serializer): title = serializers.CharField(max_length=100) priority = serializers.IntegerField(min_value=1, max_value=5) ``` Dans ce cas, il peut tout à fait être utilisé pour les requêtes HTMX. ```python from django.shortcuts import render def todo_create_with_serializer(request): if request.method == "POST": serializer = TodoSerializer(data=request.POST) if serializer.is_valid(): title = serializer.validated_data["title"] priority = serializer.validated_data["priority"] return render(request, "todos/partials/todo_item.html", { "title": title, "priority": priority, }) return render(request, "todos/partials/todo_form_serializer.html", { "errors": serializer.errors, "data": request.POST, }, status=400) ``` Comme vous pouvez le voir, **techniquement, il n'y a aucun problème.** Les Serializers ne sont pas uniquement destinés à recevoir du JSON. Cependant, une différence subtile apparaît ici. Lorsque vous utilisez un Form : * Maintien des valeurs saisies * Rendu par champ * Liaison des erreurs * Connexion avec le template Cela s'enchaîne naturellement. En revanche, lorsque vous utilisez un Serializer : * Il faut décomposer `serializer.errors` manuellement pour l'adapter à la structure du template * Les valeurs d'entrée existantes doivent être passées séparément * Le développeur doit accorder plus d'attention à la connexion avec le re-rendu du formulaire HTML En d'autres termes, **il est utilisable, mais cela implique un peu plus de travail manuel**. C'est précisément à cause de cela que l'utilisation d'un Serializer avec [[HTMX]] peut sembler un peu forcée. --- ## Conclusion {#sec-37e5d418cdb7} Dans le précédent article, nous avons examiné comment [[HTMX]] envoie les données. Dans celui-ci, nous avons résumé la manière la plus naturelle de valider ces données dans Django. * HTMX s'harmonise naturellement avec les données de formulaire * Django Form est l'outil conçu précisément pour ce flux * Par conséquent, en termes de compatibilité avec HTMX, le Form est le choix le plus naturel * Le DRF Serializer est utilisable, mais il s'agit plutôt d'un choix stratégique Personnellement, je pense que pour exploiter pleinement HTMX, il est nécessaire de retrouver non seulement le **"sens de la manipulation d'AJAX de manière HTML-esque"**, mais aussi le **"sens de l'utilisation des formulaires et des balises de formulaire Django"**. --- **Articles connexes** * [Simplifier le développement web dynamique avec Django et HTMX (Partie 1)](/ko/whitedec/2025/1/27/django-htmx-dynamic-web-simplification/) * [Simplifier le développement web dynamique avec Django et HTMX - Ajax (Partie 2)](/ko/whitedec/2025/1/27/django-htmx-dynamic-web-simplification-2/) * [Simplifier le développement web dynamique avec Django et HTMX (Partie 3) : Méthodes d'intégration à Django](/ko/whitedec/2025/1/27/django-htmx-dynamic-web-simplification-3/) * [Simplifier le développement web dynamique avec Django et HTMX (Partie 4) : Comment gérer les payloads ?](/ko/whitedec/2025/1/27/django-htmx-advanced-features/)