ฉันจะรวม Ajax กับแอปพลิเคชัน Django ได้อย่างไร


264

ฉันใหม่สำหรับ Django และค่อนข้างใหม่สำหรับ Ajax ฉันกำลังทำงานในโครงการที่ฉันต้องการรวมทั้งสองอย่างเข้าด้วยกัน ฉันเชื่อว่าฉันเข้าใจหลักการที่อยู่เบื้องหลังพวกเขาทั้งสอง แต่ไม่พบคำอธิบายที่ดีของทั้งสองเข้าด้วยกัน

มีคนให้คำอธิบายสั้น ๆ เกี่ยวกับวิธีที่ codebase ต้องเปลี่ยนแปลงด้วยการที่พวกเขาสองคนรวมเข้าด้วยกันได้อย่างไร

ตัวอย่างเช่นฉันยังสามารถใช้HttpResponseกับ Ajax หรือการตอบสนองของฉันต้องเปลี่ยนด้วยการใช้ Ajax หรือไม่ ถ้าเป็นเช่นนั้นคุณช่วยกรุณายกตัวอย่างว่าการตอบสนองต่อการร้องขอจะต้องเปลี่ยนแปลงอย่างไร? หากสร้างความแตกต่างใด ๆ ข้อมูลที่ฉันส่งคืนคือ JSON

คำตอบ:


637

แม้ว่าสิ่งนี้จะไม่ได้อยู่ในจิตวิญญาณของ SO ทั้งหมด แต่ฉันรักคำถามนี้เพราะฉันมีปัญหาแบบเดียวกันเมื่อฉันเริ่มดังนั้นฉันจะให้คำแนะนำสั้น ๆ แก่คุณ เห็นได้ชัดว่าคุณไม่เข้าใจหลักการที่อยู่เบื้องหลังพวกเขา (อย่าถือเป็นความผิด แต่ถ้าคุณทำคุณจะไม่ถาม)

Django คือฝั่งเซิร์ฟเวอร์ หมายความว่าลูกค้าไปที่ URL คุณมีฟังก์ชั่นภายในviewsที่แสดงสิ่งที่เขาเห็นและตอบกลับใน HTML ลองแยกเป็นตัวอย่าง:

views.py:

def hello(request):
    return HttpResponse('Hello World!')

def home(request):
    return render_to_response('index.html', {'variable': 'world'})

index.html:

<h1>Hello {{ variable }}, welcome to my awesome site</h1>

urls.py:

url(r'^hello/', 'myapp.views.hello'),
url(r'^home/', 'myapp.views.home'),

นั่นเป็นตัวอย่างของประเพณีที่ง่ายที่สุด ไป127.0.0.1:8000/helloหมายถึงการร้องขอไปยังhello()ฟังก์ชั่นที่จะไป127.0.0.1:8000/homeกลับindex.htmlและแทนที่ตัวแปรทั้งหมดตามที่ถาม (คุณอาจจะรู้ทั้งหมดนี้โดยตอนนี้)

ตอนนี้ขอพูดคุยเกี่ยวกับAJAX การเรียก AJAX เป็นรหัสฝั่งไคลเอ็นต์ที่ทำการร้องขอแบบอะซิงโครนัส ฟังดูซับซ้อน แต่มันก็หมายความว่ามันจะทำคำขอให้คุณเป็นเบื้องหลังแล้วจัดการกับการตอบสนอง ดังนั้นเมื่อคุณทำการโทร AJAX สำหรับบาง URL คุณจะได้รับข้อมูลเดียวกับที่คุณจะได้รับเมื่อผู้ใช้ไปยังสถานที่นั้น

ตัวอย่างเช่นการโทร AJAX ที่127.0.0.1:8000/helloจะกลับมาเหมือนเดิมถ้าคุณเข้าเยี่ยมชม เฉพาะเวลานี้คุณมีในฟังก์ชัน JavaScript และคุณสามารถจัดการกับมันได้ตามที่คุณต้องการ ลองดูกรณีการใช้งานที่เรียบง่าย:

$.ajax({
    url: '127.0.0.1:8000/hello',
    type: 'get', // This is the default though, you don't actually need to always mention it
    success: function(data) {
        alert(data);
    },
    failure: function(data) { 
        alert('Got an error dude');
    }
}); 

กระบวนการทั่วไปคือ:

  1. การโทรจะไปที่ URL 127.0.0.1:8000/helloราวกับว่าคุณเปิดแท็บใหม่และทำเอง
  2. หากสำเร็จ (รหัสสถานะ 200) ให้ทำฟังก์ชั่นเพื่อความสำเร็จซึ่งจะแจ้งเตือนข้อมูลที่ได้รับ
  3. หากล้มเหลวให้ทำฟังก์ชันอื่น

ตอนนี้จะเกิดอะไรขึ้นที่นี่? คุณจะได้รับการแจ้งเตือนด้วย 'สวัสดีโลก' ในนั้น จะเกิดอะไรขึ้นถ้าคุณโทรไปที่บ้านของ AJAX? <h1>Hello world, welcome to my awesome site</h1>สิ่งเดียวที่คุณจะได้รับการแจ้งเตือนที่ระบุ

กล่าวอีกนัยหนึ่ง - ไม่มีอะไรใหม่เกี่ยวกับการโทร AJAX พวกเขาเป็นเพียงวิธีให้คุณให้ผู้ใช้รับข้อมูลและข้อมูลโดยไม่ต้องออกจากหน้าและทำให้การออกแบบเว็บไซต์ของคุณราบรื่นและเรียบร้อยมาก แนวทางบางประการที่คุณควรทราบ:

  1. เรียนรู้ jQuery ฉันไม่สามารถความเครียดนี้พอ คุณต้องเข้าใจนิดหน่อยเพื่อที่จะทราบวิธีจัดการกับข้อมูลที่คุณได้รับ คุณจะต้องเข้าใจไวยากรณ์ JavaScript พื้นฐาน (ไม่ไกลจาก python คุณจะคุ้นเคยกับมัน) ฉันขอแนะนำวิดีโอสอนของ Envato สำหรับ jQueryมันยอดเยี่ยมมากและจะนำคุณไปสู่เส้นทางที่ถูกต้อง
  2. เมื่อไหร่ที่จะใช้ JSON . คุณจะเห็นตัวอย่างมากมายที่ข้อมูลที่ส่งมาจากมุมมอง Django อยู่ใน JSON ผมไม่ได้ไปลงในรายละเอียดว่าเพราะมันไม่สำคัญว่าจะทำมัน (มีความอุดมสมบูรณ์ของคำอธิบายดาษดื่น) และจำนวนมากขึ้นที่สำคัญเมื่อ และคำตอบก็คือ - ข้อมูล JSON นั้นเป็นข้อมูลต่อเนื่อง นั่นคือข้อมูลที่คุณสามารถจัดการได้ เช่นเดียวกับที่ฉันกล่าวถึงการโทร AJAX จะดึงการตอบสนองราวกับว่าผู้ใช้ทำเอง ตอนนี้บอกว่าคุณไม่ต้องการยุ่งกับ html ทั้งหมดและต้องการส่งข้อมูลแทน (อาจเป็นรายการวัตถุ) JSON นั้นดีสำหรับสิ่งนี้เพราะมันส่งเป็นวัตถุ (ข้อมูล JSON ดูเหมือนพจนานุกรมไพ ธ อน) จากนั้นคุณสามารถวนซ้ำหรือทำอย่างอื่นที่ไม่จำเป็นต้องกรองผ่าน HTML ที่ไม่มีประโยชน์
  3. เพิ่มล่าสุด เมื่อคุณสร้างแอปพลิเคชันเว็บและต้องการใช้ AJAX - ทำสิ่งที่คุณโปรดปราน ขั้นแรกให้สร้างแอปทั้งหมดโดยสมบูรณ์โดยไม่มี AJAX ใด ๆ เห็นว่าทุกอย่างทำงานได้ จากนั้นเริ่มเขียนสาย AJAX นั่นเป็นกระบวนการที่ดีที่ช่วยให้คุณเรียนรู้ได้มากเช่นกัน
  4. การใช้งานโครเมี่ยมของเครื่องมือสำหรับนักพัฒนา เนื่องจากการโทร AJAX เสร็จสิ้นในบางครั้งจึงเป็นเรื่องยากที่จะทำการดีบัก คุณควรใช้เครื่องมือสำหรับนักพัฒนาซอฟต์แวร์โครม (หรือเครื่องมือที่คล้ายกันเช่น firebug) และconsole.logสิ่งต่าง ๆ ในการแก้ไขข้อบกพร่อง ฉันจะไม่อธิบายรายละเอียดเพียงแค่ google และค้นหาเกี่ยวกับมัน มันจะเป็นประโยชน์กับคุณมาก
  5. การรับรู้ CSRF สุดท้ายจำไว้ว่าคำขอโพสต์ใน Django csrf_tokenต้อง ด้วยการโทร AJAX หลายครั้งที่คุณต้องการส่งข้อมูลโดยไม่ต้องรีเฟรชหน้าเว็บ คุณอาจจะต้องเผชิญกับปัญหาบางอย่างก่อนที่จะต้องการจำไว้ว่า - csrf_tokenรอคุณลืมที่จะส่ง นี่เป็นสิ่งกีดขวางสำหรับผู้เริ่มต้นที่รู้จักในการรวม AJAX-Django แต่หลังจากที่คุณเรียนรู้วิธีทำให้เล่นได้ดีมันก็ง่ายเหมือนพาย

นั่นคือทุกอย่างที่มาถึงหัวของฉัน มันเป็นวิชาที่กว้างใหญ่ แต่ใช่มีตัวอย่างไม่เพียงพอ เพียงแค่ทำงานในแบบของคุณช้าคุณจะได้มันในที่สุด


1
ขอบคุณ ฉันแค่อยู่ที่ที่คุณอยู่ฉันรู้ความรู้สึก สำหรับการสนทนา - โดยทั่วไปแล้วใช่ แต่ไม่ใช่ในขณะนี้ (เช่นสำหรับคำถามเฉพาะที่คุณมี ... ดี ... ความสมบูรณ์ของ SO)
yuvi

2
ป.ล. วิดีโอที่ฉันเชื่อมโยงมี AJAX ตลอดทั้งสัปดาห์ ผ่านพวกเขาไปอย่างจริงจัง พวกเขายอดเยี่ยมมาก
yuvi

ขอบคุณ @yuvi สำหรับสิ่งนี้! ฉันถามตัวเองคำถามเดียวกันเกี่ยวกับ AJAX ยิ่งกว่านั้นฉันไม่แน่ใจว่าจะต้องใช้ AJAX หรือไม่ ตัวอย่างเช่นฉันเข้าใจว่าฉันต้องใช้ Javascript บางตัวเพื่อจัดการรูปแบบ Modal Bootstrapแต่ฉันไม่เข้าใจว่าเกี่ยวข้องกับ AJAX หรือไม่ และอย่างจริงจังต้องเรียนรู้ทั้งหมด Jquery เพียงเพื่อให้ปรากฏป๊อปอัพในหน้าของฉัน ... ฉันไม่เห็นผลตอบแทนการลงทุน :( มีทางเลือกที่ง่ายกว่านี้หรือไม่ :( ขอบคุณอีกครั้งสำหรับคำตอบของคุณ
เดวิด D.

5
@DavidW สวัสดีเดวิดฉันมีความสุขที่คำตอบของฉันได้ช่วยคุณ AJAX เป็นเทคนิคที่คุณสามารถทำได้ด้วยจาวาสคริปต์อย่างง่าย แต่อาจซับซ้อนมาก jQuery มีทางลัดที่ทำให้ง่ายขึ้นมาก มันไม่มีอะไรเกี่ยวข้องกับ modal ของ Bootstrap (คุณสามารถดึงแบบฟอร์มผ่าน AJAX ได้หากต้องการ แต่ไม่เกี่ยวข้องกัน) อย่างไรก็ตามฉันขอแนะนำให้คุณลองและคิดวิธีของคุณช้า jQuery มีความสำคัญและพื้นฐานมากในทุกวันนี้การลงทุนที่ดีจึงมี เมื่อคุณพบสิ่งกีดขวางบนถนนมาที่ SO แล้วถาม (ไม่ใช่ที่นี่ในความคิดเห็นของคำถามที่ตอบแล้วให้เปิดคำถามใหม่) โชคดี!
yuvi

เกี่ยวกับการกล่าวถึงของคุณcsrf_tokenเราสามารถหลีกเลี่ยงวิธีนี้ได้หรือไม่? ถ้าเรามีฟังก์ชั่นตัวอย่างajaxCall()เราก็สามารถใช้วิธีการดั้งเดิมของบางอย่างเช่น<form onsubmit='ajaxCall();return false;'>นี้ได้ไหม
ytpillai

22

นอกเหนือจากคำตอบที่ยอดเยี่ยมของ yuvi ฉันต้องการเพิ่มตัวอย่างเล็ก ๆ เกี่ยวกับวิธีจัดการกับสิ่งนี้ภายใน Django (นอกเหนือจาก js ใด ๆ ที่จะใช้) ตัวอย่างการใช้งานAjaxableResponseMixinและถือว่าเป็นโมเดลผู้แต่ง

import json

from django.http import HttpResponse
from django.views.generic.edit import CreateView
from myapp.models import Author

class AjaxableResponseMixin(object):
    """
    Mixin to add AJAX support to a form.
    Must be used with an object-based FormView (e.g. CreateView)
    """
    def render_to_json_response(self, context, **response_kwargs):
        data = json.dumps(context)
        response_kwargs['content_type'] = 'application/json'
        return HttpResponse(data, **response_kwargs)

    def form_invalid(self, form):
        response = super(AjaxableResponseMixin, self).form_invalid(form)
        if self.request.is_ajax():
            return self.render_to_json_response(form.errors, status=400)
        else:
            return response

    def form_valid(self, form):
        # We make sure to call the parent's form_valid() method because
        # it might do some processing (in the case of CreateView, it will
        # call form.save() for example).
        response = super(AjaxableResponseMixin, self).form_valid(form)
        if self.request.is_ajax():
            data = {
                'pk': self.object.pk,
            }
            return self.render_to_json_response(data)
        else:
            return response

class AuthorCreate(AjaxableResponseMixin, CreateView):
    model = Author
    fields = ['name']

ที่มา: เอกสาร Django, การจัดการแบบฟอร์มที่มีมุมมองแบบคลาส

ลิงก์ไปยังเวอร์ชัน 1.6 ของ Django ไม่สามารถอัปเดตเป็นเวอร์ชั่น 1.11 ได้อีกต่อไป


14

ฉันกำลังเขียนสิ่งนี้เพราะคำตอบที่ได้รับการยอมรับนั้นค่อนข้างเก่า

นี่คือวิธีที่ฉันจะรวมอาแจ็กซ์กับ Django ในปี 2019 :) และลองยกตัวอย่างจริง ๆ เมื่อเราต้องการอาแจ็กซ์: -

ช่วยบอกว่าฉันมีรูปแบบชื่อผู้ใช้ที่ลงทะเบียนและด้วยความช่วยเหลือของ Ajax ฉันต้องการทราบว่ามีชื่อผู้ใช้ที่มีอยู่หรือไม่

HTML:

<p id="response_msg"></p> 
<form id="username_exists_form" method='GET'>
      Name: <input type="username" name="username" />
      <button type='submit'> Check </button>           
</form>   

อาแจ็กซ์:

$('#username_exists_form').on('submit',function(e){
    e.preventDefault();
    var username = $(this).find('input').val();
    $.get('/exists/',
          {'username': username},   
          function(response){ $('#response_msg').text(response.msg); }
    );
}); 

urls.py:

from django.contrib import admin
from django.urls import path
from . import views

urlpatterns = [
    path('admin/', admin.site.urls),
    path('exists/', views.username_exists, name='exists'),
]

views.py:

def username_exists(request):
    data = {'msg':''}   
    if request.method == 'GET':
        username = request.GET.get('username').lower()
        exists = Usernames.objects.filter(name=username).exists()
        if exists:
            data['msg'] = username + ' already exists.'
        else:
            data['msg'] = username + ' does not exists.'
    return JsonResponse(data)

นอกจากนี้ยังrender_to_responseซึ่งเป็นที่เลิกใช้แล้วและถูกแทนที่ด้วยการแสดงผลและจาก Django 1.7 เป็นต้นไปแทนHttpResponseเราใช้JsonResponseสำหรับการตอบสนองอาแจ็กซ์ เนื่องจากมันมาพร้อมกับตัวเข้ารหัส JSON ดังนั้นคุณไม่จำเป็นต้องทำให้เป็นอนุกรมข้อมูลก่อนที่จะส่งคืนวัตถุการตอบสนอง แต่HttpResponseไม่ได้เลิก


8

เรียบง่ายและดี คุณไม่จำเป็นต้องเปลี่ยนมุมมองของคุณ Bjax จัดการลิงก์ของคุณทั้งหมด ลองดู สิ Bjax

การใช้งาน:

<script src="bjax.min.js" type="text/javascript"></script>
<link href="bjax.min.css" rel="stylesheet" type="text/css" />

ในที่สุดให้รวมสิ่งนี้ไว้ในส่วนหัวของ html ของคุณ:

$('a').bjax();

สำหรับการตั้งค่าเพิ่มเติมลองชำระเงินที่นี่: การ สาธิต Bjax


18
สวัสดีโน้ตสั้น ๆ - ฉันต้องการแนะนำให้ทุกคนที่เพิ่งเริ่มเรียนรู้ Django และ \ หรือ AJAX - โปรดอย่าใช้สิ่งนี้ คุณจะไม่ได้เรียนรู้อะไรเลย เก็บไว้ในรายการโปรดของคุณและสร้างคำขอ AJAX ด้วยตัวคุณเอง กลับมาและใช้ Bjax เมื่อคุณคุ้นเคยกับการทำงานในพื้นหลังแล้ว สิ่งนี้ไม่เหมือนกับการบอกให้ผู้คนเรียนรู้ Assembly เพื่อเขียนโค้ด - คุณไม่จำเป็นต้องสร้างคำขอ AJAX ของคุณด้วย JS บริสุทธิ์เพียง jQuery เพราะถ้าคุณต้องการเป็นมืออาชีพนั่นเป็นความรู้พื้นฐานขั้นต่ำที่คุณจะต้องรู้ จำเป็นต้องมี เสียงเชียร์
yuvi

5

AJAX เป็นวิธีที่ดีที่สุดในการทำงานแบบอะซิงโครนัส การโทรแบบอะซิงโครนัสเป็นสิ่งที่ใช้กันทั่วไปในการสร้างเว็บไซต์ เราจะยกตัวอย่างสั้น ๆ เพื่อเรียนรู้วิธีการใช้ AJAX ใน Django เราจำเป็นต้องใช้ jQuery เพื่อเขียน javascript ให้น้อยลง

นี่คือตัวอย่างการติดต่อซึ่งเป็นตัวอย่างที่ง่ายที่สุดที่ฉันใช้เพื่ออธิบายพื้นฐานของ AJAX และการนำไปใช้ใน Django เราจะทำการร้องขอ POST ในตัวอย่างนี้ ฉันกำลังติดตามตัวอย่างของโพสต์นี้: https://djangopy.org/learn/step-up-guide-to-implement-ajax-in-django

models.py

ก่อนอื่นเรามาสร้างรูปแบบการติดต่อโดยมีรายละเอียดพื้นฐาน

from django.db import models

class Contact(models.Model):
    name = models.CharField(max_length = 100)
    email = models.EmailField()
    message = models.TextField()
    timestamp = models.DateTimeField(auto_now_add = True)

    def __str__(self):
        return self.name

forms.py

สร้างแบบฟอร์มสำหรับโมเดลด้านบน

from django import forms
from .models import Contact

class ContactForm(forms.ModelForm):
    class Meta:
        model = Contact
        exclude = ["timestamp", ]

views.py

มุมมองมีลักษณะคล้ายกับมุมมองสร้างตามฟังก์ชั่นพื้นฐาน แต่แทนที่จะกลับมาพร้อมกับการแสดงผลเรากำลังใช้การตอบสนอง JsonResponse

from django.http import JsonResponse
from .forms import ContactForm

def postContact(request):
    if request.method == "POST" and request.is_ajax():
        form = ContactForm(request.POST)
        form.save()
        return JsonResponse({"success":True}, status=200)
    return JsonResponse({"success":False}, status=400)

urls.py

มาสร้างเส้นทางของมุมมองด้านบนกัน

from django.contrib import admin
from django.urls import path
from app_1 import views as app1

urlpatterns = [
    path('ajax/contact', app1.postContact, name ='contact_submit'),
]

แบบ

การย้ายไปยังส่วนหน้าให้เรนเดอร์ฟอร์มที่สร้างขึ้นเหนือแท็กฟอร์มล้อมรอบพร้อมกับปุ่ม csrf_token และส่ง โปรดทราบว่าเราได้รวมไลบรารี jquery

<form id = "contactForm" method= "POST">{% csrf_token %}
   {{ contactForm.as_p }}
  <input type="submit" name="contact-submit" class="btn btn-primary" />
</form>

<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>

จาวาสคริ

ตอนนี้เรามาคุยกันเกี่ยวกับส่วนของจาวาสคริปต์ในแบบฟอร์มการส่งเรากำลังขออาแจ็กซ์ประเภท POST รับข้อมูลในแบบฟอร์มและส่งไปยังฝั่งเซิร์ฟเวอร์

$("#contactForm").submit(function(e){
    // prevent from normal form behaviour
        e.preventDefault();
        // serialize the form data  
        var serializedData = $(this).serialize();
        $.ajax({
            type : 'POST',
            url :  "{% url 'contact_submit' %}",
            data : serializedData,
            success : function(response){
            //reset the form after successful submit
                $("#contactForm")[0].reset(); 
            },
            error : function(response){
                console.log(response)
            }
        });
   });

นี่เป็นเพียงตัวอย่างพื้นฐานในการเริ่มต้นกับ AJAX กับ django ถ้าคุณต้องการดำน้ำด้วยตัวอย่างอีกหลายตัวคุณสามารถอ่านบทความนี้: https://djangopy.org/learn/step-up-guide-to- ใช้-อาแจ็กซ์ใน Django


2

ฉันพยายามใช้AjaxableResponseMixinในโครงการของฉัน แต่ได้จบลงด้วยข้อความแสดงข้อผิดพลาดต่อไปนี้:

กำหนดค่าไม่ถูกต้อง: ไม่มี URL ที่จะเปลี่ยนเส้นทางไป ระบุ URL หรือกำหนดเมธอด get_absolute_url บน Model

นั่นเป็นเพราะ CreateView จะส่งคืนการตอบสนองการเปลี่ยนเส้นทางแทนที่จะส่งกลับ HttpResponse เมื่อคุณส่งคำขอ JSON ไปยังเบราว์เซอร์ AjaxableResponseMixinดังนั้นผมจึงได้ทำการเปลี่ยนแปลงบางอย่างไป หากการร้องขอเป็นการร้องขอ ajax มันจะไม่เรียกใช้super.form_validเมธอดเพียงเรียกใช้form.save()โดยตรง

from django.http import JsonResponse
from django import forms
from django.db import models

class AjaxableResponseMixin(object):
    success_return_code = 1
    error_return_code = 0
    """
    Mixin to add AJAX support to a form.
    Must be used with an object-based FormView (e.g. CreateView)
    """
    def form_invalid(self, form):
        response = super(AjaxableResponseMixin, self).form_invalid(form)
        if self.request.is_ajax():
            form.errors.update({'result': self.error_return_code})
            return JsonResponse(form.errors, status=400)
        else:
            return response

    def form_valid(self, form):
        # We make sure to call the parent's form_valid() method because
        # it might do some processing (in the case of CreateView, it will
        # call form.save() for example).
        if self.request.is_ajax():
            self.object = form.save()
            data = {
                'result': self.success_return_code
            }
            return JsonResponse(data)
        else:
            response = super(AjaxableResponseMixin, self).form_valid(form)
            return response

class Product(models.Model):
    name = models.CharField('product name', max_length=255)

class ProductAddForm(forms.ModelForm):
    '''
    Product add form
    '''
    class Meta:
        model = Product
        exclude = ['id']


class PriceUnitAddView(AjaxableResponseMixin, CreateView):
    '''
    Product add view
    '''
    model = Product
    form_class = ProductAddForm

0

เมื่อเราใช้ Django:

Server ===> Client(Browser)   
      Send a page

When you click button and send the form,
----------------------------
Server <=== Client(Browser)  
      Give data back. (data in form will be lost)
Server ===> Client(Browser)  
      Send a page after doing sth with these data
----------------------------

หากคุณต้องการเก็บข้อมูลเก่าไว้คุณสามารถทำได้โดยไม่ต้องใช้ Ajax (หน้าจะรีเฟรช)

Server ===> Client(Browser)   
      Send a page
Server <=== Client(Browser)  
      Give data back. (data in form will be lost)
Server ===> Client(Browser)  
      1. Send a page after doing sth with data
      2. Insert data into form and make it like before. 
      After these thing, server will send a html page to client. It means that server do more work, however, the way to work is same.

หรือคุณสามารถทำได้ด้วย Ajax (หน้าจะไม่รีเฟรช)

--------------------------
<Initialization> 
Server ===> Client(Browser) [from URL1]    
      Give a page                      
--------------------------  
<Communication>
Server <=== Client(Browser)     
      Give data struct back but not to refresh the page.
Server ===> Client(Browser) [from URL2] 
      Give a data struct(such as JSON)
---------------------------------

หากคุณใช้ Ajax คุณต้องทำสิ่งเหล่านี้:

  1. เริ่มต้นหน้า HTML โดยใช้ URL1 (โดยปกติเราจะเริ่มต้นหน้าโดยแม่แบบ Django) จากนั้นเซิร์ฟเวอร์จะส่งหน้า html ให้กับลูกค้า
  2. ใช้ Ajax เพื่อสื่อสารกับเซิร์ฟเวอร์โดยใช้ URL2 จากนั้นเซิร์ฟเวอร์จะส่งโครงสร้างข้อมูลให้ลูกค้า

Django แตกต่างจาก Ajax เหตุผลในการนี้มีดังนี้:

  • สิ่งที่ลูกค้ากลับมานั้นแตกต่างกัน กรณีของ Django คือหน้า HTML กรณีของ Ajax คือโครงสร้างข้อมูล 
  • Django เก่งในการสร้างบางสิ่ง แต่สามารถสร้างได้ครั้งเดียวเท่านั้นมันไม่สามารถเปลี่ยนแปลงอะไรได้เลย Django เปรียบเสมือนอะนิเมะที่ประกอบไปด้วยรูปภาพมากมาย ในทางตรงกันข้าม Ajax ไม่ดีในการสร้าง sth แต่เก่งในการเปลี่ยน sth ในหน้า html ที่มีอยู่

ในความคิดของฉันหากคุณต้องการใช้ Ajax ทุกที่ เมื่อคุณต้องการเริ่มต้นหน้าด้วยข้อมูลในตอนแรกคุณสามารถใช้ Django กับ Ajax แต่ในบางกรณีคุณแค่ต้องการหน้าคงที่ไม่มีอะไรจากเซิร์ฟเวอร์คุณไม่จำเป็นต้องใช้เทมเพลต Django

หากคุณไม่คิดว่าอาแจ็กซ์เป็นแนวปฏิบัติที่ดีที่สุด คุณสามารถใช้เทมเพลต Django เพื่อทำทุกอย่างเช่นอะนิเมะ

(ภาษาอังกฤษของฉันไม่ดี)

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.