Django Form-Komponente
Django-Formularkomponenten werden verwendet, um Seiten zu initialisieren, HTML-Tags zu erzeugen und auch von Benutzern übermittelte Daten zu validieren (Fehlermeldungen anzuzeigen).
Anzeigereihenfolge der Fehlermeldungen:
- Zuerst werden die Fehlermeldungen aus den Feldattributen angezeigt, dann die Fehlermeldungen aus den lokalen Hooks.
- Wenn die Fehlermeldungen aus den Feldattributen angezeigt werden, werden die Fehlermeldungen aus den lokalen Hooks nicht angezeigt.
- Wenn es globale Hooks gibt, starten die globalen Hooks die Validierung erst, nachdem alle Daten validiert wurden, und die Fehlermeldungen der globalen Hooks werden auf jeden Fall angezeigt.
Um Form-Komponenten zu verwenden, müssen Sie zuerst forms importieren:
from django import forms

Als Nächstes erstellen wir eine Datei My_forms.py im Verzeichnis app01:
app01/My_forms.py
from django import forms
from django.core.exceptions import ValidationError
from app01 import models
class EmpForm(forms.Form):
name = forms.CharField(min_length=4, label="Name", error_messages={"min_length": "Sie sind zu kurz.", "required": "Dieses Feld darf nicht leer sein!"})
age = forms.IntegerField(label="Alter")
salary = forms.DecimalField(label="Gehalt")
from django.core.exceptions import ValidationError
from app01 import models
class EmpForm(forms.Form):
name = forms.CharField(min_length=4, label="Name", error_messages={"min_length": "Sie sind zu kurz.", "required": "Dieses Feld darf nicht leer sein!"})
age = forms.IntegerField(label="Alter")
salary = forms.DecimalField(label="Gehalt")
Feldattribute:
- label: Die Textinformation vor dem Eingabefeld.
- error_message: Passen Sie die angezeigten Fehlermeldungen an. Der Attributwert ist ein Dictionary, wobei `required` der Schlüssel zum Festlegen der Fehlermeldung ist, die angezeigt wird, wenn das Feld nicht leer sein darf.
app01/views.py
from django.shortcuts import render, HttpResponse
from app01.My_Forms import EmpForm
from app01 import models
from django.core.exceptions import ValidationError
# Erstellen Sie hier Ihre Views.
def add_emp(request):
if request.method == "GET":
form = EmpForm()
return render(request, "add_emp.html", {"form": form})
else:
form = EmpForm(request.POST)
if form.is_valid(): # Datenvalidierung durchführen
# Validierung erfolgreich
data = form.cleaned_data # Werte, die die Validierung bestehen, werden in cleaned_data abgelegt.
data.pop('r_salary')
print(data)
models.Emp.objects.create(**data)
return HttpResponse(
'ok'
)
# return render(request, "add_emp.html", {"form": form})
else:
print(form.errors) # Fehlermeldungen ausgeben
clean_errors = form.errors.get("__all__")
print(222, clean_errors)
return render(request, "add_emp.html", {"form": form, "clean_errors: clean_errors})
from app01.My_Forms import EmpForm
from app01 import models
from django.core.exceptions import ValidationError
# Erstellen Sie hier Ihre Views.
def add_emp(request):
if request.method == "GET":
form = EmpForm()
return render(request, "add_emp.html", {"form": form})
else:
form = EmpForm(request.POST)
if form.is_valid(): # Datenvalidierung durchführen
# Validierung erfolgreich
data = form.cleaned_data # Werte, die die Validierung bestehen, werden in cleaned_data abgelegt.
data.pop('r_salary')
print(data)
models.Emp.objects.create(**data)
return HttpResponse(
'ok'
)
# return render(request, "add_emp.html", {"form": form})
else:
print(form.errors) # Fehlermeldungen ausgeben
clean_errors = form.errors.get("__all__")
print(222, clean_errors)
return render(request, "add_emp.html", {"form": form, "clean_errors: clean_errors})
Fügen Sie die Regeln zur Datei app01/urls.py hinzu:
path('add_emp/', views.add_emp)
HTML-Vorlage:
app01/add_emp
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title></title>
</head>
<body>
<h3>Mitarbeiter hinzufügen</h3>{#1. HTML Pages Manually#}<form action="" method="post">
<p>Name:<input type="text" name="name"></p>
<p>Alter:<input type="text" name="age"></p>
<p>Gehalt:<input type="text" name="salary"></p>
<input type="submit">
</form>{#2. Implementiert über die as_p-Methode des Formularobjekts#}
{#<form action="" method="post" novalidate>#}
{# {% csrf_token %}#}
{# {{ form.as_p }}#}
{# <input type="submit">#}
{#</form>#}
{#3. Die Felder des Formularobjekts manuell abrufen#}
{#<form action="" method="post" novalidate>#}
{# {% csrf_token %}#}
{# <div>#}
{# <label for="id_{{ form.name.name }}">Name</label>#}
{# {{ form.name }} <span>{{ form.name.errors.0 }}</span>#}
{# </div>#}
{# <div>#}
{# <label for="id_{{ form.age.name }}">Alter</label>#}
{# {{ form.age }} <span>{{ form.age.errors.0 }}</span>#}
{# </div>#}
{# <div>#}
{# <label for="id_salary">Gehalt</label>#}
{# {{ form.salary }} <span>{{ form.salary.errors.0 }}</span>#}
{# </div>#}
{# <input type="submit">#}
{#</form>#}
{#4. Eine for-Schleife verwenden, um alle Felder anzuzeigen#}
{#<form action="" method="post" novalidate>#}
{# {% csrf_token %}#}
{# {% for field in form %}#}
{# <div>#}
{# <label for="id_{{ field.name }}">{{ field.label }}</label>#}
{# {{ field }} <span>{{ field.errors.0 }}</span>#}
{# </div>#}
{# {% endfor %}#}
{# <input type="submit">#}
{#</form>#}
</body>
</html>
Das Ausführungsergebnis ist wie in der folgenden Abbildung dargestellt:

Lokale Hooks und globale Hooks
Definieren Sie die Form-Klasse:
app01/My_forms.py
from django import forms
from django.core.exceptions import ValidationError
from app01 import models
class EmpForm(forms.Form):
name = forms.CharField(min_length=5, label="Name", error_messages={"required": "Dieses Feld darf nicht leer sein!",
"min_length": "Der Benutzername ist zu kurz."})
age = forms.IntegerField(label="Alter")
salary = forms.DecimalField(max_digits=5, decimal_places=2, label="Gehalt")
r_salary = forms.DecimalField(max_digits=5, decimal_places=2, label="Bitte geben Sie das Gehalt erneut ein.")
def clean_name(self): # Lokaler Hook
val = self.cleaned_data.get("name")
if val.isdigit():
raise ValidationError("Der Benutzername darf nicht nur aus Zahlen bestehen")
elif models.Emp.objects.filter(name=val):
raise ValidationError("Der Benutzername existiert bereits!")
else:
return val
def clean(self): # Globaler Hook, um zu bestätigen, ob die beiden eingegebenen Gehälter übereinstimmen.
val = self.cleaned_data.get("salary")
r_val = self.cleaned_data.get("r_salary")
if val == r_val:
return self.cleaned_data
else:
raise ValidationError("Bitte bestätigen Sie, ob das Gehalt konsistent ist.")
from django.core.exceptions import ValidationError
from app01 import models
class EmpForm(forms.Form):
name = forms.CharField(min_length=5, label="Name", error_messages={"required": "Dieses Feld darf nicht leer sein!",
"min_length": "Der Benutzername ist zu kurz."})
age = forms.IntegerField(label="Alter")
salary = forms.DecimalField(max_digits=5, decimal_places=2, label="Gehalt")
r_salary = forms.DecimalField(max_digits=5, decimal_places=2, label="Bitte geben Sie das Gehalt erneut ein.")
def clean_name(self): # Lokaler Hook
val = self.cleaned_data.get("name")
if val.isdigit():
raise ValidationError("Der Benutzername darf nicht nur aus Zahlen bestehen")
elif models.Emp.objects.filter(name=val):
raise ValidationError("Der Benutzername existiert bereits!")
else:
return val
def clean(self): # Globaler Hook, um zu bestätigen, ob die beiden eingegebenen Gehälter übereinstimmen.
val = self.cleaned_data.get("salary")
r_val = self.cleaned_data.get("r_salary")
if val == r_val:
return self.cleaned_data
else:
raise ValidationError("Bitte bestätigen Sie, ob das Gehalt konsistent ist.")
Code der Datei views.py:
app01/views.py
def add_emp(request):
if request.method == "GET":
form = EmpForm() # Formularobjekt initialisieren
return render(request, "add_emp.html", {"form":form})
else:
form = EmpForm(request.POST) # Daten an das Formularobjekt übergeben
if form.is_valid(): # Validierung durchführen
data = form.cleaned_data
data.pop("r_salary")
models.Emp.objects.create(**data)
return redirect("/index/")
else: # Validierung fehlgeschlagen
clear_errors = form.errors.get("__all__") # Globale Hook-Fehlerinformationen abrufen
return render(request, "add_emp.html", {"form": form, "clear_errors": clear_errors})
if request.method == "GET":
form = EmpForm() # Formularobjekt initialisieren
return render(request, "add_emp.html", {"form":form})
else:
form = EmpForm(request.POST) # Daten an das Formularobjekt übergeben
if form.is_valid(): # Validierung durchführen
data = form.cleaned_data
data.pop("r_salary")
models.Emp.objects.create(**data)
return redirect("/index/")
else: # Validierung fehlgeschlagen
clear_errors = form.errors.get("__all__") # Globale Hook-Fehlerinformationen abrufen
return render(request, "add_emp.html", {"form": form, "clear_errors": clear_errors})
Der Code der Vorlagendatei lautet wie folgt:
app01/add_emp
<form action="" method="post" novalidate>
{% csrf_token %}
<div>
<label for="id_{{ form.name.name }}">Name</label>
{{ form.name }} <span>{{ form.name.errors.0 }}</span>
</div>
<div>
<label for="id_{{ form.age.name }}">Alter</label>
{{ form.age }} <span>{{ form.age.errors.0 }}</span>
</div>
<div>
<label for="id_salary">Gehalt</label>
{{ form.salary }} <span>{{ form.salary.errors.0 }}{{ clear_errors.0 }}</span>
</div>
<div>
<label for="id_r_salary">Bitte geben Sie das Gehalt erneut ein.</label>
{{ form.r_salary }} <span>{{ form.r_salary.errors.0 }}{{ clear_errors.0 }}</span>
</div>
<input type="submit">
</Form>
Das Ausführungsergebnis ist wie in der folgenden Abbildung dargestellt:

