Wie benutze ich die ajax Funktion, um ein Formular zu senden, ohne dass die Seite aktualisiert wird? Was fehlt mir? Muss ich Rest-Framework dafür verwenden?

8

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%     
mike braa 25.03.2016, 09:54
quelle

11 Antworten

1

Nachdem Sie Ihren Code vollständig gelesen und mit OP diskutiert haben. Ich habe das OP-Problem gelöst.

  1. Nach dem Entfernen von HttpResponseRedirect habe ich es zuerst in JsonResponse konvertiert und entsprechende Änderungen vorgenommen.

    %Vor%
  2. 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.

    %Vor%
  3. 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%
  4. 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.

JRodDynamite 02.04.2016, 17:55
quelle
5

Siehe das offizielle Dokument von submit () und serialize () und modifiziere deinen Ajax so:

%Vor%

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.

    
Hiren patel 30.03.2016 17:52
quelle
2

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%
Vibhu 28.03.2016 05:26
quelle
2

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.

    
CrazyGeek 29.03.2016 11:20
quelle
1

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"

%Vor%

});

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:

%Vor%

JsonResponse und model_to_dict

Viel Glück!

P.S. Beachten Sie, dass das eingehende Modell vor dem Speichern validiert werden muss

    
Alexey Sidash 29.03.2016 22:29
quelle
0

Beispielhaft möchte ich Ihnen zeigen, wie Sie dies mit Django REST Framework erreichen und wie viel Code Sie NICHT ändern müssen.

TL; DR

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.

1. Installieren Sie django-rest-framework mit diesem Handbuch.

2. Erstellen Sie eine serializers.py -Datei mit folgendem Inhalt

%Vor%

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.

3. Fügen Sie Ihrem views.py die folgende Ansicht hinzu:

%Vor%

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.

4. Fügen Sie Ihrer Hauptdatei urls.py

Folgendes hinzu: %Vor%

Hier registrieren Sie Ihre API-Ansicht als eine Route, an die Sie Anfragen senden können.

5. Bearbeiten Sie Ihre ajax -Anfrage

%Vor%

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 .

6. Mach was du brauchst mit dem neu erstellten 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!

    
iulian 01.04.2016 09:20
quelle
0

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%     
Pouria 02.04.2016 13:30
quelle
0

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.

    
Gustavo Rubio 02.04.2016 21:52
quelle
-1

In Ihrem Javascript rufen Sie die Klasse .commentForAjax. Sie sollten die ID aufrufen:

%Vor%

Hoffe, das hilft. R

    
Romain biard 25.03.2016 10:00
quelle
-1

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.

    
Atilla Arda Açıkgöz 25.03.2016 10:09
quelle
-1

$ (Dokument) .on ('submit', '. commentForAjax', Funktion (e) {       e.preventDefault ();

// Setzen Sie

e.stopPropagation ();

    
Nadeem Shinwari 26.03.2016 06:29
quelle