Ich versuche, mein Kommentarformular mit Ajax zu senden, gerade jetzt, wenn der Benutzer einen Kommentar einfügt, wird die ganze Seite aktualisiert. Ich möchte, dass es nett eingefügt wird, ohne dass die Seite aktualisiert wird. Also habe ich viele Dinge ausprobiert, aber kein Glück. Da ich ein Anfänger bin, habe ich versucht, viele Tutorial-Links zu folgen; Ссылка Ссылка
Mir ist klar, dass ich Schwierigkeiten habe, meinen Code in views.py und forms.py zu manipulieren Bevor ich also eine Client-seitige Programmierung (js und ajax) mache, muss ich mein Backend (Python-Code) erneut für den Ajax setzen. Kann mir bitte jemand dabei helfen? Ich weiß nicht, wie ich mein Backend einstellen soll ...
%Vor%Ich weiß nicht, was ich hier machen soll ... Ich habe es versucht, aber schade .... was hier vorgeht})
Das ist mein forms.py
%Vor%und meine views.py
%Vor%Ich bin immer noch sehr wackelig bei der Idee, Ajax zu benutzen, selbst nachdem ich ein Tutorial darüber gelesen habe ... wie JSON ins Spiel kommt und wie ich ansichten.pie.in ändern sollte ... kann jemand bitte erklären, wie sie alle sind zusammen gruppieren und mir helfen, das zu erledigen ...
%Vor%Nachdem Sie Ihren Code vollständig gelesen und mit OP diskutiert haben. Ich habe das OP-Problem gelöst.
Nach dem Entfernen von HttpResponseRedirect
habe ich es zuerst in JsonResponse
konvertiert und entsprechende Änderungen vorgenommen.
Der nächste Schritt bestand darin, einfach eine DOM-Manipulation durchzuführen, um die aus der Antwort abgerufenen Daten anzuzeigen. Aber es stellte sich heraus, dass dies komplizierter war als erwartet. Also, um es zu vereinfachen, habe ich einfach die Vorlage in 2 Teile getrennt - einer wird der Hauptteil sein und der andere enthält den HTML-Code nur des Kommentars.
Mit django.template.loader.render_to_string
habe ich den benötigten HTML-Code generiert Zeigen Sie den Kommentar an und senden Sie ihn mit der Antwort als Zeichenfolge in JSON.
Schließlich funktionierte der Code nach geringfügigen Änderungen (nicht relevant für das aktuelle Problem) hauptsächlich in den DOM-Manipulationsskripts und in einem der Formularmodelle wie erwartet.
%Vor%BONUS: Es gab ein weiteres kleines Problem , mit dem wir konfrontiert worden waren, aber ich Ich werde es hier nicht diskutieren. Ich habe dafür eine separate Antwort geschrieben.
Siehe das offizielle Dokument von submit () und serialize () und modifiziere deinen Ajax so:
Auf der Backend-Seite geben Sie HttpResponseRedirect()
zurück, was Ihren Ajax-Aufruf an eine URL umleitet (Statuscode = 302). Ich werde vorschlagen, eine json Antwort zurückzugeben.
Fügen Sie für Django 1.7+ die Zeile from django.http import JsonResponse
hinzu, um die json-Antwort zurückzugeben.
Für pre Django 1.7 verwende return HttpResponse(json.dumps(response_data), content_type="application/json")
Ändern Sie diesen Teil Ihrer views.py , um JSON-Antwort
zurückzugeben %Vor%Sie müssen nicht Rest-Framework verwenden. Aber wenn Sie Rest-Framework für diesen Zweck verwenden, wird es einfach zu implementieren sein.
Dies ist die allgemeine Struktur Ihrer Kommentar-App. Ich nehme an, dass Sie Django REST Framework
verwenden %Vor%Kommentarmodell (models.py)
%Vor%Kommentarformular (forms.py)
%Vor%Kommentarformularansicht und API-Ansicht (ansichten.py)
%Vor%Schlussendlich clientseitiger Code AJAX / JQuery
%Vor% Nach Ihrem aktuellen Code Es sieht so aus, als würde es immer umgeleitet werden, da Sie nach der Validierung des Kommentarformulars und der Aktualisierung in die Datenbank HttpResponseRedirect
zurückgeben, das für die Weiterleitung vorgesehen ist.
Ich denke, was Sie wollen, ist den Kommentar in die Datenbank zu aktualisieren und eine Erfolgsantwort zu erhalten.
Um dies zu erreichen, müssen Sie den Antworttyp ändern. Ich würde vorschlagen, zurückzugeben JsonResponse und basierend auf der JSON-Antwort können Sie auch den HTML-Code aktualisieren. Ich bin mir sicher, dass die Rückgabe von JSON nicht dazu führt, dass Sie Ihren HTML-Code umleiten.
Lass es mich wissen, wenn es dir klar ist.
Danke.
Das Wichtigste, was Sie tun müssen, um das erneute Laden der Seite beim Senden von Formularen zu verhindern, ist das Aufrufen von event.preventDefault()
in Ihrem Formular submit
-Ereignishandler.
@Vibhu hat in der obigen Antwort ein sehr gutes Codebeispiel angegeben. Genau das müssen Sie auf der Client-Seite tun. (Ich gebe seinem Code einen einzigen Unterschied, die Anfrage wird an "comment / create-ajax" gesendet, nicht an "comment / create"
});
Auf der Server-Seite können Sie einen weiteren Controller (in Django-Termen angezeigt) zur Verfügung stellen, der POST /comments/create-ajax
verarbeitet, er sollte folgendermaßen aussehen:
JsonResponse und model_to_dict
Viel Glück!
P.S. Beachten Sie, dass das eingehende Modell vor dem Speichern validiert werden muss
Beispielhaft möchte ich Ihnen zeigen, wie Sie dies mit Django REST Framework erreichen und wie viel Code Sie NICHT ändern müssen.
Die Installation von DRF unterbricht nichts. Fügen Sie einfach 8 Codezeilen hinzu (ohne Importe), ändern Sie 2 vorhandene Zeilen und entfernen Sie Ihre gesamte comment_create_view
.
Für diejenigen, die an weiteren Details interessiert sind, lesen Sie bitte weiter.
django-rest-framework
mit diesem Handbuch. serializers.py
-Datei mit folgendem Inhalt Hier definieren Sie die Klasse, die serialisiert wird (eine Comment
-Modellinstanz in ein json
-Objekt transformieren) und deserialisieren (umgekehrte Aktion der Umwandlung eines json
-Objekts in eine Comment
-Instanz) Ihre Kommentare.
views.py
die folgende Ansicht hinzu:
Hinweis: Diese 4 Codezeilen ersetzen tatsächlich Ihre gesamte comment_create_view
.
Hier definieren Sie eine generische Ansicht, die speziell für die Erstellung von Objekten entworfen wurde. CreateAPIView
behandelt nur POST
-Anfragen und verwendet die Klasse CommentSerializer
, um Objekte zu konvertieren. Eine Serialisierungsklasse für Django-REST-Framework ist, was eine Formularklasse für Django ist - sie verarbeitet die Validierung von Daten und gibt eine Antwort in Form von json
oder entsprechende Fehlermeldungen (auch in json) zurück, falls Ihre Daten nicht korrekt sind.
urls.py
Hier registrieren Sie Ihre API-Ansicht als eine Route, an die Sie Anfragen senden können.
ajax
-Anfrage Sie haben POST
an die neu erstellten API-Endpunktdaten in Form von json
, und Ihr Serializer übernimmt sie und erstellt daraus eine Comment
-Modell-Instanz, die in der Datenbank gespeichert wird. Wenn Sie beim Erstellen einer Instanz Comment
(oder eines anderen Modells) ein bestimmtes Verhalten benötigen, können Sie die Methode .create()
Ihrer CommentSerializer
überschreiben. Weitere Informationen finden Sie im Django-REST-Framework-Lernprogramm .
comment
Dieser Teil gilt auch für Nicht-Django-REST-Framework-Szenarien. Sobald Sie die comment
erfolgreich erstellt haben, erhalten Sie diese in Ihrer success
-Funktion in JSON-Form und abhängig davon, was Sie damit machen wollen, müssen Sie das gewünschte Verhalten in dieser success
-Funktion definieren.
Grundsätzlich ist es das. Bitte beachten Sie, dass das hier beschriebene Beispiel ein minimal erforderlicher Code ist, damit es für Sie funktioniert. Ich habe die vorgefertigten Django-REST-Framework-Funktionen verwendet, aber natürlich gibt es viele weitere Möglichkeiten, die Dinge zum Laufen zu bringen. Möglicherweise müssen Sie einige Standardmethoden außer Kraft setzen, aber am Ende, weil DRF entwickelt wurde, um mit Ajax-Aufrufen umzugehen, wird Ihr Code kürzer und sauberer sein.
Viel Glück!
Dies ist das einfachste Beispiel für die Implementierung von Ajax-Formularen in Verbindung mit Django:
Sie können Ajax Post verwenden, um JSON
an Django zu senden und dann die Argumente als dict()
zu behandeln. Hier ist ein Beispiel:
Im Browser (JQuery / JavaScript):
%Vor%In der Server-Engine (Python):
%Vor%Wenn das Formular nicht Ihren Backend-Code, sondern Ihren JavaScript-Code einreicht, müssen Sie verhindern, dass das Formular übermittelt wird. Sie können dies folgendermaßen ändern:
%Vor%Dazu:
%Vor%Stellen Sie also sicher, dass Sie das Submit-Ereignis direkt nach dem Laden des Dokuments binden, damit der Browser weiß, dass das Formular nicht gesendet werden soll. Dann führen Sie einfach Ihren Ajax-Aufruf aus und tun, was Sie mit den zurückgegebenen serialisierten Daten vom Server benötigen .
Wenn das Formular erneut gesendet wird, hat es nichts mit dem Backend-Code zu tun.
Hinweis: Wenn Sie für jQuery-Selektoren eine ID auswählen möchten, verwenden Sie das Zeichen #element
. Wenn Sie Klassenselektoren verwenden möchten, verwenden Sie die Punktnotation .elements
. Beachten Sie auch, dass Sie theoretisch nur ein Element nach ID auswählen können (da Sie die ID für andere Elemente nicht duplizieren), aber Klassen werden normalerweise dazu verwendet, mehrere Elemente mit denselben Attributen zu umfassen.
In Ihrem Javascript rufen Sie die Klasse .commentForAjax. Sie sollten die ID aufrufen:
%Vor%Hoffe, das hilft. R
In Ihrem Formular-Tag unter
%Vor% Sie müssen keine Aktion oder Methode definieren. Du handelst mit ihnen über Ajax. Also lösche sie und dein Formular versucht nicht, diese Aktion auszuführen. Und hoffentlich löst es dein Problem mit der Refresh-Seite. Ändere auch deine Einreichungszeile '.commentForAjax'
in '#commentForAjax'
, da es keine Klasse ist, sondern eine ID.
$ (Dokument) .on ('submit', '. commentForAjax', Funktion (e) { e.preventDefault ();
// Setzen Sie
e.stopPropagation ();
Tags und Links python django javascript jquery ajax