## Dynamische Webentwicklung vereinfachen mit [[Django]] und [[HTMX]]: Einsatz von Forms und Serializern {#sec-b233da7ff7c9} Im letzten Artikel haben wir uns angesehen, wie **[[HTMX]] Daten an den Server sendet**. **Vergangener Artikel** : [Django와 HTMX로 동적 웹 개발 단순화하기 (4편): Payload 전송 방식](/ko/whitedec/2025/1/27/django-htmx-csrf-token-integration/) Wir haben festgestellt, dass **HTMX dem Senden von Formulardaten durch das Sammeln von Werten aus dem DOM ähnlicher ist**, während das herkömmliche `fetch()` von JavaScript eher dem direkten Erstellen und Senden von JSON-Payloads entspricht. Da stellt sich natürlich die Frage: **"Womit lässt sich diese über HTMX empfangene Daten in Django am natürlichsten validieren?"** Anfangs denken viele vielleicht an den **DRF Serializer**. Tatsächlich ist der Serializer ein mächtiges Validierungstool und kann auch für Nicht-JSON-Daten verwendet werden. Doch bei der praktischen Anwendung mit HTMX fühlt es sich manchmal etwas erzwungen an. Warum ist das so? Der Grund ist einfach: **Der grundlegende Ablauf von HTMX ist der Welt der HTML-Formulare ähnlicher, und Django bietet bereits `Form`-Klassen, die genau für diese Welt entwickelt wurden.** In diesem Artikel werden wir erläutern, **wie `Django Form` und `DRF Serializer` jeweils bei der Verarbeitung von HTMX-Anfragen eingesetzt werden können** und **welche Option die natürlichere und praktischere Wahl darstellt.**  --- ## Die von [[HTMX]] gesendeten Daten ähneln letztlich "Formulardaten" {#sec-8c911eee119a} Wie im letzten Teil erläutert, sammelt HTMX grundsätzlich Werte von HTML-Elementen und sendet sie an den Server. Dies geschieht entweder durch das Senden von Eingabewerten innerhalb eines `
``` Dieses Beispiel ist sehr einfach, zeigt aber gut die Kompatibilität von [[HTMX]] und Django Form. * Bei Misserfolg kann das gesamte Formular neu gerendert werden. * Die vom Benutzer eingegebenen Werte bleiben erhalten. * Fehlermeldungen werden natürlich neben den Feldern angezeigt. Mit dem herkömmlichen Ansatz von `fetch()` + JSON + manueller DOM-Manipulation hätte man wahrscheinlich viel JavaScript benötigt, um diesen Ablauf zu implementieren. Doch mit der Kombination aus HTMX und Django Form lässt sich dies wesentlich einfacher nur mit serverseitigem Code und Templates bewerkstelligen. --- ## Braucht man dann keinen Serializer mehr? {#sec-5f0d93fcd48a} Zu sagen, **man bräuchte den Serializer gar nicht**, wäre wohl zu weit hergeholt. Ich denke, es wäre besser, es so auszudrücken: **Man sollte den Serializer nicht unbedingt als Standard wählen.** Tatsächlich ist der [[DRF]] Serializer in folgenden Situationen weiterhin sehr attraktiv: * Wenn DRF bereits im gesamten Projekt intensiv genutzt wird. * Wenn dieselbe Validierungslogik in APIs und serverseitig gerenderten Ansichten wiederverwendet werden soll. * Wenn die Eingabeprüfungslogik komplex ist und bereits gut im Serializer organisiert wurde. * Wenn geplant ist, dieselbe Funktionalität später auch für mobile Apps oder externe APIs bereitzustellen. Das heißt, es geht beim Serializer nicht um die Frage, **"Kann er mit HTMX verwendet werden?"**, sondern eher um die Frage, **"Bringt es architektonisch einen Vorteil, den Serializer hier überhaupt einzusetzen?"** --- ## Der Serializer kann ebenfalls verwendet werden {#sec-bfbe9c61b12c} Nehmen wir zum Beispiel an, es existiert bereits ein Serializer wie der folgende: ```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) ``` In diesem Fall kann er auch problemlos in HTMX-Anfragen verwendet werden. ```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) ``` Wie Sie sehen, gibt es **technisch keinerlei Probleme.** Der Serializer ist schließlich kein Tool, das nur JSON akzeptiert. Doch hier zeigen sich subtile Unterschiede. Bei Verwendung von Form: * Beibehaltung der Eingabewerte * Feldweises Rendering * Fehlerbindung * Verbindung mit dem Template Dies alles geschieht nahtlos. Bei Verwendung des Serializers hingegen: * `serializer.errors` müssen manuell an die Template-Struktur angepasst werden. * Bestehende Eingabewerte müssen separat übergeben werden. * Der Entwickler muss sich stärker um die Verbindung zum Neu-Rendering des HTML-Formulars kümmern. Kurz gesagt, **es ist nutzbar, erfordert aber etwas mehr manuellen Aufwand.** Genau an diesem Punkt kann der Serializer bei der Verwendung mit [[HTMX]] etwas erzwungen wirken. --- ## Fazit {#sec-37e5d418cdb7} Im letzten Teil haben wir untersucht, wie [[HTMX]] Daten sendet. In diesem Teil haben wir nun zusammengefasst, wie diese Daten in Django am natürlichsten validiert werden können. * HTMX harmoniert grundsätzlich gut mit Formulardaten. * Django Form ist genau das Tool, das für diesen Workflow entwickelt wurde. * Betrachtet man daher nur die Kompatibilität mit HTMX, ist Form die natürlichste Wahl. * Der DRF Serializer kann verwendet werden, ist aber eher eine strategische Option. Persönlich denke ich, dass man, um HTMX richtig nutzen zu können, nicht nur ein Gefühl dafür entwickeln muss, **"AJAX HTML-ähnlich zu behandeln"**, sondern auch **"Django Form und Form-Tags effektiv einzusetzen."** --- **Weiterführende Artikel** * [Django와 HTMX로 동적 웹 개발을 단순화하기 (1편)](/ko/whitedec/2025/1/27/django-htmx-dynamic-web-simplification/) * [Django와 HTMX로 동적 웹 개발을 단순화하기 - Ajax (2편)](/ko/whitedec/2025/1/27/django-htmx-dynamic-web-simplification-2/) * [Django와 HTMX로 동적 웹 개발 단순화하기 (3편): Django 통합 방법](/ko/whitedec/2025/1/27/django-htmx-dynamic-web-simplification-3/) * [Django와 HTMX로 동적 웹 개발을 단순화하기 (4편): payload는 어떻게?](/ko/whitedec/2025/1/27/django-htmx-advanced-features/)