[PYTHON] Ajax in Django (mit generischer Klassenansicht)

Die Suche nach "Django Ajax" trifft auf einige Artikel, aber die meisten basierten auf funktionsbasierten Ansichten, daher erklärte ich den Code anhand der Allzweckansicht.

Allzweckansicht Wenn Sie nicht damit vertraut sind, beginnen wir dort.

Dies ist meine persönliche Meinung, aber ich denke, einer der großen Vorteile der Einführung von Django ist die Verwendung klassenbasierter generischer Ansichten. ~~ ** Ich denke, das ist wahrscheinlich die beste Vorgehensweise **. ~~

Fertiges Produktbild

GitHub- skokado / django_ajax: Django + Ajax-Beispiel

Die eingegebene Zeichenfolge wird auf dem Bildschirm angezeigt.

Entscheiden Sie die Spezifikationen einfach.

1.gif

Codekommentar

Die Komponenten sind weitgehend unten.

--urls.py: Routing (URL-Bindung) --forms.py: Definieren Sie Formulare, in die Benutzer Daten eingeben können --views.py: Beschreiben der Anforderungsverarbeitung. --Verwenden Sie die generische Ansicht "FormView" --Verwenden Sie "Request.is_ajax ()", um Ajax-Anforderungen zu identifizieren --Template (index.html): HTML zum Anzeigen. Dieser Artikel enthält auch jQuery.

Vorbereitung

Erstellen Sie ein Django-Projekt und eine Django-Anwendung ordnungsgemäß.

Beschreiben Sie die Routing-Regel in "urls.py".

urls.py

Der einzige zu verwendende Pfad ist / greet.

django_ajax/urls.py


from django.urls import path

from . import views


urlpatterns = [
    path('greet/', views.GreetView.as_view(), name='greet'),
]

forms.py

Geben Sie einfach "Name" ein

greeting/forms.py


from django import forms


class GreetForm(forms.Form):
    name = forms.CharField(label='Wie heißen Sie?')

index.html

<Div id =" result "> Hallo untergeordnetes Element von, [name] 's! Das Wort wird hinzugefügt. (Dieser Prozess wird in jQuery beschrieben.)

<h1>Let's Greeting!</h1>
<form action="" method="post">{% csrf_token %}
    {{ form }}
    <button type="submit">Senden</button>
</form>

<div id="result">
    <!--Hier ist die Begrüßung<p>Tag-Elemente werden hinzugefügt-->
</div>

--Script Teil

Ich denke, es kann gelesen werden, dass der jQuery-Teil auch den obigen Spezifikationen entspricht. Außerdem brauche ich jQuery (nicht schlank), also lade es.

<script src="https://code.jquery.com/jquery-3.5.1.min.js" integrity="sha256-9/aliU8dGd2tb6OSsuzixeV4y/faTqgFtohetphbbj0=" crossorigin="anonymous"></script>
<script>
//Legen Sie einen Ereignis-Listener für die Senden-Schaltfläche fest. Beschreiben der Ajax-Verarbeitung im Inneren
$("form").submit(function(event) {
    event.preventDefault();
    var form = $(this);
    $.ajax({
      url: form.prop("action"),
      method: form.prop("method"),
      data: form.serialize(),
      timeout: 10000,
      dataType: "text",
    })
    .done(function(data) {
        $("#result").append("<p>" + data + "</p>");
    })
});
</script>
`index.html`
<h1>Let's Greeting!</h1>
<form action="" method="post">{% csrf_token %}
    {{ form }}
    <button type="submit">Senden</button>
</form>

<div id="result">
    <!-- Will be replaced with inputed text by Ajax -->
</div>

<script src="https://code.jquery.com/jquery-3.5.1.min.js" integrity="sha256-9/aliU8dGd2tb6OSsuzixeV4y/faTqgFtohetphbbj0=" crossorigin="anonymous"></script>
<script>
//Legen Sie einen Ereignis-Listener für die Senden-Schaltfläche fest. Beschreiben der Ajax-Verarbeitung im Inneren
$("form").submit(function(event) {
    event.preventDefault();
    var form = $(this);
    $.ajax({
      url: form.prop("action"),
      method: form.prop("method"),
      data: form.serialize(),
      timeout: 10000,
      dataType: "text",
    })
    .done(function(data) {
        $("#result").append("<p>" + data + "</p>");
    })
});
</script>

views.py

Definieren Sie eine "GreetView", die von "FormView" erbt

greeting/views.py


from django.http import HttpResponse
from django.views.generic import FormView

from . import forms

# Create your views here.
class GreetView(FormView):
    template_name = 'index.html'  #Vorlagenname(HTML-Dateiname)
    form_class = forms.GreetForm
    success_url = '/greet'

    def post(self, request, *args, **kwargs):
        form = self.get_form(self.form_class)
        if form.is_valid():
            if request.is_ajax():
                """Trennen Sie die Ajax-Verarbeitung in eine andere Methode"""
                print('### Ajax request')
                return self.ajax_response(form)
            #Behandlung anderer POST-Methoden als Ajax
            return super().form_valid(form)
        #Was tun, wenn die Formulardaten falsch sind?
        return super().form_invalid(form)

    def ajax_response(self, form):
        """Eine Methode, die eine Antwort an jQuery zurückgibt"""
        name = form.cleaned_data.get('name')
        return HttpResponse(f'Hallo,{name}San!')

Apropos

In Bezug auf "if request.is_ajax ():" in "views.py" lautet das offizielle Dokument wie folgt.

Referenz- Anforderungs- und Antwortobjekte|Django-Dokumentation| Django

(Hannari japanische Übersetzung)

HttpRequest.is_ajax()

HTTP_X_REQUESTED_MIT Header'XMLHttpRequest'In einer Zeichenfolge
Überprüft, ob die Anforderung über XMLHttpRequest erfolgt, und gibt True zurück.
Viele moderne JavaScript-Bibliotheken senden diesen Header.

Das heißt, diese Methode kann nur verwendet werden, wenn "XMLHttpRequest" in "HTTP_X_REQUESTED_WITH" im Anforderungsheader festgelegt ist. jQuery scheint dies richtig einzustellen. ** Ich habe ein wenig versucht, ohne jQuery (einfaches JavaScript) zu verwenden, aber es hat nicht funktioniert **.

Schreiben Sie GreetView in views.py wie folgt um und sehen Sie sich den Anforderungsheader an.

class GreetView(FormView):
    template_name = 'greet.html'
    form_class = forms.GreetForm
    success_url = '/greet'

    def post(self, request, *args, **kwargs):
        #★ Ergänzung
        for k, v in request.META.items():
            print(k, v)
        # ...(Gleiches gilt weiter unten)

--Ergebnis

...
HTTP_ACCEPT text/plain, */*; q=0.01
HTTP_X_REQUESTED_WITH XMLHttpRequest  # <=Dies
HTTP_USER_AGENT Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36
...

Zusammenfassung

Das Obige ist ein Beispiel für Djangos Ajax in einer Allzweckansicht. Ich denke, es ist prägnanter als die anderen Artikel. Außerdem möchte ich versuchen, was in Kombination mit StreamingHttpResponse getan werden kann

Recommended Posts

Ajax in Django (mit generischer Klassenansicht)
Verwendung von Bootstrap in der generischen Klassenansicht von Django
Hochladen von Dateien in der generischen Klassenansicht von Django
So identifizieren Sie die Zugriffsquelle in der generischen Klassenansicht von Django eindeutig
DJango Hinweis: Von Anfang an (mit einer generischen Ansicht)
Erste Schritte und Verwendung von auf Klassenklassen basierenden generischen Ansichten in Django
Erstellen Sie eine einfache CRUD-App mit der generischen Klassenansicht von Django
Stellen Sie Django in 3 Minuten mit Docker-Compose bereit
Implementierung der Like-Schaltfläche in Django + Ajax
Memo zur Informationsaufzeichnung mit Sitzung in Django
CSS-Umgebung in 10 Minuten mit Django erstellt
Django funktionsbasierte Ansicht
Anzeigen von Arzneimittelbewertungen mithilfe von Listen in Python
Django Tutorial Zusammenfassung für Anfänger von Anfängern ④ (Generic View)
Django klassenbasierte Ansicht
Geben Sie die Ansichts-URL in der Django-Vorlage an
Versuchen Sie es mit einer objektorientierten Klasse in R (R6-Methode)
Form in Django
Fallklasse in Python
Schreiben Sie Dekorateur in der Klasse
Bilder mit Matplotlib anzeigen
Modelländerungen in Django
Django2 Konfigurationsmuster anzeigen
Versuchen Sie es mit Django templates.html
Klassennotation in Python
[Django 2.2] Wie zeigen Sie das Beziehungsziel in Django an? [Listenansicht]
Erstellen Sie eine Shogi Score Management App mit Django 4 ~ Create View ~
So generieren Sie eine Abfrage mit dem IN-Operator in Django
Erstellen Sie mit Django ein benutzerfreundliches Folgemodell mit ManyToManyField through