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")

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})

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.")

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})

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:

Weitere Erweiterungen