„Wenn ein Arbeiter seine Arbeit gut machen will, muss er zuerst seine Werkzeuge schärfen.“ – Konfuzius, „Die Gespräche des Konfuzius. Lu Linggong“
Titelseite > Programmierung > CRUD-Operationen in Python und Django – Teil 2

CRUD-Operationen in Python und Django – Teil 2

Veröffentlicht am 29.07.2024
Durchsuche:473

In unserem vorherigen Artikel haben wir die Grundlagen der Einrichtung eines Django-Projekts behandelt und unser Übungsmodell erstellt, das wir im Frontend als Liste angezeigt haben. In diesem Artikel befassen wir uns intensiv mit der Durchführung von CRUD-Vorgängen. Für diejenigen, die es nicht kennen: CRUD steht für Erstellen, Lesen, Aktualisieren und Löschen – im Wesentlichen die vier grundlegenden Aktionen, die Sie mit Ihren Daten durchführen können.

Da wir nun unsere API im App-Ordner eingerichtet haben, erweitern wir einfach die Indexansicht, um Erstellungs-, Aktualisierungs- und Löschanfragen zu verarbeiten.

Die Form

Lassen Sie uns ein Formular einrichten, mit dem Benutzer Übungen erstellen können. Zu diesem Zweck werden wir wieder HTML-Vorlagen verwenden. Erstellen Sie zunächst eine neue Vorlage mit dem Namen add_exercise.html im Ordner app/templates.

{% csrf_token %}

Als nächstes fügen wir in unsere Vorlage „index.html“ die Vorlage „add_exercise.html“ mit der folgenden Methode ein:

{% extends "base.html" %} {% block content %}
    

Exercises

{% include 'add_exercise.html' %} ... {% endblock %}

Wir verwenden hier das Tag „include“, das die Zusammensetzbarkeit in HTML-Vorlagen fördert und die Pflege und das Verständnis unseres Codes erleichtert. Wenn Sie die Seite in Ihrem Browser aktualisieren, sollte das Formular auf dem Bildschirm erscheinen.

Add Exercise

In unserem HTML verwenden wir das Tag 

 mit dem auf POST gesetzten Methodenattribut und dem auf / verweisenden Aktionsattribut. Dies ist derselbe Endpunkt, den wir zum Abrufen der Übungsliste verwenden.

In diesem Zusammenhang ist das csrf_token ein Sicherheitsmerkmal, das durch einen zufällig generierten geheimen Wert dargestellt wird. Es trägt dazu bei, unsere Formulareinsendungen vor Fälschungsangriffen zu schützen, wofür CSRF steht – Cross-Site Request Forgery. Für jede Benutzersitzung wird ein eindeutiges Token generiert, auf das Websites Dritter nicht zugreifen können, wodurch unbefugte Änderungen verhindert werden.

Unser Formular enthält zwei Eingabefelder: eines für den Titel und eines für das Datum, entsprechend dem Schema unseres Übungsmodells. Wenn das Formular gesendet wird, werden die Werte für Titel und Datum über eine POST-Anfrage an den Endpunkt / gesendet, der dann von unserer Indexansicht in app/views.py verarbeitet wird.

Das Model

In Django können wir unser Übungsmodell – im Wesentlichen eine Python-Klasse – erweitern, indem wir spezifische Methoden hinzufügen, die CRUD-Operationen entsprechen. In die Datei „app/models.py“ fügen wir Folgendes ein:

class Exercise(models.Model):
    ...

    def create(request):
        title = request.POST.get('title')
        date = request.POST.get('date')

        exercise = Exercise.objects.create(title=title, date=date)

        return exercise

Wir können über die POST-Anfrage auf Titel und Datum zugreifen, wie im obigen Code gezeigt. Dann können wir Djangos integriertes ORM nutzen, um eine neue Übung zu erstellen und die erstellte Instanz zurückzugeben.

Wir nutzen dieselbe Indexansicht, die wir zum Abrufen von Übungen verwenden, und erweitern sie, um zu prüfen, ob die Anforderungsmethode POST ist. Wenn ja, übergeben wir das Anforderungsobjekt an die zuvor definierte Klassenmethode. Sobald die Übung erstellt ist, leiten wir den Benutzer zurück zur Startseite oder führen eine Seitenaktualisierung durch, um sicherzustellen, dass die neu hinzugefügte Übung auf dem Bildschirm angezeigt wird.

from django.http import HttpResponseRedirect

from app import models

...

def index(request):
    if request.method == 'POST':
        models.Exercise.create(request)
        return redirect('/')

    exercises = (
        models.Exercise.objects.all().order_by("created_at")
    )
    return render(request, "index.html", context={'exercises': exercises})

Versuchen Sie jetzt, eine neue Übung zu erstellen. Sie sollte dann unten in der Liste angezeigt werden.

Update-Übung

Lassen Sie uns unseren Code ein wenig umgestalten, bevor wir den Übungen Aktualisierungsfunktionen hinzufügen. Wir verschieben die Übungen in eine eigene Vorlage namens exercise.html.

Exercises

{% include 'add_exercise.html' %}
    {% for exercise in exercises %}
  • {% include 'exercise.html' %}
  • {% endfor %}

Erstellen Sie eine Vorlage für „exercise.html“ im Ordner „app/templates“ und wir fügen ihr den folgenden HTML-Code hinzu:

{% csrf_token %}

Wir verwenden erneut das Tag 

 für jede Übung in der Liste und fügen eine versteckte Eingabe für exercise.id hinzu, die zum Aktualisieren der Übung verwendet wird. Gehen Sie zurück zum Browser und aktualisieren Sie die Seite. Sie sollten für jede Übung in der Liste ein Formular sehen, in dem jede Eingabe mit den entsprechenden Übungsdaten vorab ausgefüllt ist.

CRUD Operations In Python & Django - Part 2

Beachten Sie, dass wir nicht PUT als Formularmethode verwenden. Stattdessen verwenden wir POST. Dies liegt daran, dass die View-Handler nur Daten analysieren können, die über GET- und POST-Anfragen gesendet werden, ohne integrierte Unterstützung für PUT und DELETE. Als wir die Methode „Klasse erstellen“ in der Klasse „Übung“ erstellt haben, ist Ihnen vielleicht aufgefallen, dass wir „request.POST.get('title')“ verwendet haben. Während dies für POST-Anfragen funktioniert, sind im Anfrageobjekt keine PUT- oder DELETE-Methoden verfügbar.

Aber wie unterscheiden wir zwischen einer POST- und einer PUT-Anfrage? Wenn Sie das Formular überprüfen, das wir zuvor erstellt haben, werden Sie feststellen, dass wir der Schaltfläche „Senden“ ein Namensattribut zugewiesen haben. Wir können auf dieses Attribut auf die gleiche Weise zugreifen, wie wir auf Titel und Datum zugegriffen haben, indem wir request.POST.get('update') verwenden.

Aktualisieren wir das Formular zum Erstellen einer Übung, um dieselbe Änderung aufzunehmen.

...

Und in unserer Übungsansicht werden wir die folgenden Änderungen vornehmen, um zwischen Anfragen zu unterscheiden.

def index(request):
    if request.method == 'POST':
        create = 'create' in request.POST
        update = 'update' in request.POST

        if create == True:
            models.Exercise.create(request)
        elif update == True:
            models.Exercise.update(request)

        return redirect('/')

    exercises = (
        models.Exercise.objects.all().order_by("created_at")
    )
    return render(request, "index.html", context={'exercises': exercises})

Wir prüfen den Namen der Schaltfläche und leiten die Anfrage entsprechend an die entsprechende Übungsmethode weiter.

Fügen wir dem Übungsmodell in app/models.py eine Aktualisierungsklassenmethode hinzu.

def update(request):
    id = request.POST.get('id')
    title = request.POST.get('title')
    date = request.POST.get('date')

    exercise = Exercise.objects.filter(pk=id).update(title=title, date=date)

    return exercise

Um eine Zeile in der Datenbank zu aktualisieren, können wir die im Übungsmodell verfügbare Aktualisierungsmethode verwenden. Vor der Aktualisierung müssen wir jedoch sicherstellen, dass wir die richtige Übung aktualisieren. Dazu filtern wir die Übungen nach dem Primärschlüssel, also der ID, und aktualisieren nur diese spezifische Übung.

Übung löschen

Ähnlich fügen wir neben jeder Übung in der Vorlage „übung.html“ eine Schaltfläche zum Löschen ein.

...

Wir legen „delete“ als Wert des Namensattributs fest und erweitern in „views.py“ die if...elif-Anweisungen, um den Löschvorgang abzuwickeln.

def index(request):
    if request.method == 'POST':
        create = 'create' in request.POST
        update = 'update' in request.POST
        delete = 'delete' in request.POST

        if create == True:
            models.Exercise.create(request)
        elif update == True:
            models.Exercise.update(request)
        elif delete == True:
            models.Exercise.delete(request)

        return redirect('/')

    exercises = (
        models.Exercise.objects.all().order_by("created_at")
    )
    return render(request, "index.html", context={'exercises': exercises})

Und im Übungsmodell fügen wir die Klassenmethode delete hinzu.

def delete(request):
    id = request.POST.get('id')
    is_deleted = Exercise.objects.filter(pk=id).delete()

    if is_deleted == 1:
        return True

    return False

Mit dieser Ergänzung haben wir CRUD-Operationen erfolgreich in unserer Python- und Django-Anwendung implementiert.

Die zentralen Thesen

  1. Django-View-Handler unterstützen keine PUT- und DELETE-Anfragen, da sie die Abfrageparameter oder den Anfragetext für diese HTTP-Methoden nicht analysieren. Daher müssen wir uns auf POST-Anfragen verlassen und zwischen ihnen unterscheiden, indem wir ein zusätzliches Feld im Anfragetext übergeben.
  2. Mir ist aufgefallen, dass ich die POST-Anfrage an dieselbe Route sende, von der ich die Übungen abrufe. Dies ist wichtig, denn wenn Sie einen Endpunkt wie /api/exercises zur Bearbeitung von Anfragen erstellen würden, müssten Sie die Umleitung manuell verwalten. Andernfalls besteht das Verhalten des
    -Tags nach der Anforderung darin, den Benutzer an den im Aktionsattribut angegebenen Endpunkt umzuleiten. Daher müssen Sie den Benutzer manuell zurück zur gewünschten Seite umleiten oder in unserem Fall den Benutzer auf derselben Seite belassen.
from django.http import HttpResponseRedirect

def index(request):
    ...

    return redirect('/')
    # or
    return HttpResponseRedirect(request.META['HTTP_REFERER'])

Zusammenfassend lässt sich sagen, dass wir durch die effektive Verwaltung unserer POST-Anfragen und die Sicherstellung einer ordnungsgemäßen Weiterleitung ein nahtloses Benutzererlebnis schaffen und gleichzeitig CRUD-Vorgänge in unserer Django-Anwendung implementieren können.

Freigabeerklärung Dieser Artikel ist abgedruckt unter: https://dev.to/prvnbist/crud-operations-in-python-django-part-2-4fad?1 Bei Verstößen wenden Sie sich bitte an [email protected], um ihn zu löschen
Neuestes Tutorial Mehr>

Haftungsausschluss: Alle bereitgestellten Ressourcen stammen teilweise aus dem Internet. Wenn eine Verletzung Ihres Urheberrechts oder anderer Rechte und Interessen vorliegt, erläutern Sie bitte die detaillierten Gründe und legen Sie einen Nachweis des Urheberrechts oder Ihrer Rechte und Interessen vor und senden Sie ihn dann an die E-Mail-Adresse: [email protected] Wir werden die Angelegenheit so schnell wie möglich für Sie erledigen.

Copyright© 2022 湘ICP备2022001581号-3