首頁 > 軟體

Django中使用AJAX的詳細過程

2022-11-03 14:02:04

AJAX

AJAX是前端技術的集合,包括JavaScript、XML、HTML、CSS等。

AJAX的作用

提升使用者體驗。

JQuery

JQuery是一個相容多種瀏覽器的JavaScript庫。

JQuery的作用

JQuery簡化JavaScript的使用,同理,簡化AJAX的使用。

線上連結

Django版本:3.0.6

JQuery版本:1.12.4

<script src="http://ajax.aspnetcdn.com/ajax/jquery/jquery-1.12.4.min.js"></script>

AJAX的使用方法

urls.py

from django.urls import path
import Public.views

urlpatterns = [
    path('error/',Public.views.error),
]

views.py

from django.http import HttpResponse, request, response
from django.shortcuts import redirect, render, resolve_url
def error(request):
    if request.method == 'POST':
        num1 = request.POST.get('num1',0)
        num2 = request.POST.get('num2',0)
        num = int(num1)+int(num2)
        return HttpResponse(str(num))  #POST請求僅返回HttpResponse值
    return render(request, 'error.html')  #GET請求返回error.html介面

error.html #使用error介面進行測試

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>error</title>
    <script src="http://ajax.aspnetcdn.com/ajax/jquery/jquery-1.12.4.min.js"></script>
</head>
<body>
    <!-- 增加多個回車是為了明顯顯示是否會重新整理介面 -->
    <br> 
	<input type="text" id="d1"> +
	<input type="text" id="d2"> =
	<input type="text" id="d3">
	<button id="btn">計算</button>
    <!-- 新增csrf_token -->
	{% csrf_token %} 
<script>
    $('#btn').click(function () {
		var csrf = $('input[name="csrfmiddlewaretoken"]').val();  //增加csrf變數將在data中傳參以避免403錯誤
        // 朝後端傳送ajax請求
        $.ajax({
            // 1.指定朝哪個後端傳送ajax請求
            url:'', //不寫就是朝當前地址提交【與form表單的action引數相同】
            // 2.請求方式
            type:'post',  // 不指定預設就是get,都是小寫
            // 3.資料
            data:{'num1':$('#d1').val(), 'num2':$('#d2').val(),'csrfmiddlewaretoken': csrf},
            // 4.回撥函數:當後端給你返回結果的時候會自動觸發,args接受後端的返回結果
            success:function (args) {
                $('#d3').val(args)
            }
        })
    })
</script>
</body>
</html>

輸出效果:輸入2+2,點選計算,非同步計算結果為4並返回前端

X3倍後程式碼

urls.py

from django.urls import path
import Public.views

urlpatterns = [
    path('error/',Public.views.error),
]

views.py

from django.http import HttpResponse, request, response
from django.shortcuts import redirect, render, resolve_url
def error(request):
    if request.method == 'POST':
        num1 = request.POST.get('num1',0)
        num2 = request.POST.get('num2',0)
        num = int(num1)+int(num2)
        return HttpResponse(str(num))  #POST請求僅返回HttpResponse值
    return render(request, 'error.html')  #GET請求返回error.html介面

error.html #使用error介面進行測試

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>error</title>
    <script src="http://ajax.aspnetcdn.com/ajax/jquery/jquery-1.12.4.min.js"></script>
</head>
<body>
    <!-- 增加多個回車是為了明顯顯示是否會重新整理介面 -->
    <br> 
	<input type="text" id="d1"> +
	<input type="text" id="d2"> =
	<input type="text" id="d3">
	<button id="btn1">計算</button>
    <br> 
	<input type="text" id="d4"> +
	<input type="text" id="d5"> =
	<input type="text" id="d6">
	<button id="btn2">計算</button>
    <br> 
	<input type="text" id="d7"> +
	<input type="text" id="d8"> =
	<input type="text" id="d9">
	<button id="btn3">計算</button>
    <!-- 新增csrf_token -->
	{% csrf_token %} 
<script>
    $('#btn1').click(function () {
		var csrf = $('input[name="csrfmiddlewaretoken"]').val();  //增加csrf變數將在data中傳參以避免403錯誤
        // 朝後端傳送ajax請求
        $.ajax({
            // 1.指定朝哪個後端傳送ajax請求
            url:'', //不寫就是朝當前地址提交【與form表單的action引數相同】
            // 2.請求方式
            type:'post',  // 不指定預設就是get,都是小寫
            // 3.資料
            data:{'num1':$('#d1').val(), 'num2':$('#d2').val(),'csrfmiddlewaretoken': csrf},
            // 4.回撥函數:當後端給你返回結果的時候會自動觸發,args接受後端的返回結果
            success:function (args) {
                $('#d3').val(args)
            }
        })
    })
    $('#btn2').click(function () {
		var csrf = $('input[name="csrfmiddlewaretoken"]').val();  //增加csrf變數將在data中傳參以避免403錯誤
        // 朝後端傳送ajax請求
        $.ajax({
            // 1.指定朝哪個後端傳送ajax請求
            url:'', //不寫就是朝當前地址提交【與form表單的action引數相同】
            // 2.請求方式
            type:'post',  // 不指定預設就是get,都是小寫
            // 3.資料
            data:{'num1':$('#d4').val(), 'num2':$('#d5').val(),'csrfmiddlewaretoken': csrf},
            // 4.回撥函數:當後端給你返回結果的時候會自動觸發,args接受後端的返回結果
            success:function (args) {
                $('#d6').val(args)
            }
        })
    })
    $('#btn3').click(function () {
		var csrf = $('input[name="csrfmiddlewaretoken"]').val();  //增加csrf變數將在data中傳參以避免403錯誤
        // 朝後端傳送ajax請求
        $.ajax({
            // 1.指定朝哪個後端傳送ajax請求
            url:'', //不寫就是朝當前地址提交【與form表單的action引數相同】
            // 2.請求方式
            type:'post',  // 不指定預設就是get,都是小寫
            // 3.資料
            data:{'num1':$('#d7').val(), 'num2':$('#d8').val(),'csrfmiddlewaretoken': csrf},
            // 4.回撥函數:當後端給你返回結果的時候會自動觸發,args接受後端的返回結果
            success:function (args) {
                $('#d9').val(args)
            }
        })
    })
</script>
</body>
</html>

輸出效果:分別輸入三組數值,點選不同的計算,非同步計算結果後根據點選的計算返回前端

for迴圈後程式碼

urls.py

from django.urls import path
import Public.views

urlpatterns = [
    path('error/',Public.views.error),
]

views.py

from django.http import HttpResponse, request, response
from django.shortcuts import redirect, render, resolve_url
def error(request):
    if request.method == 'POST':
        num1 = request.POST.get('num1',0)
        num2 = request.POST.get('num2',0)
        num = int(num1)+int(num2)
        return HttpResponse(str(num))  #POST請求僅返回HttpResponse值
    return render(request, 'error.html')  #GET請求返回error.html介面

error.html #使用error介面進行測試

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <title>error</title>
    <script src="http://ajax.aspnetcdn.com/ajax/jquery/jquery-1.12.4.min.js"></script>
</head>

<body>
    {% for i in '369'|make_list %}  <!-- for迴圈 -->
        <br>  <!-- 增加多個回車是為了明顯顯示是否會重新整理介面 -->
        <input type="text" id="d{{i|add:-2}}"> +  <!-- id使用python計算 -->
        <input type="text" id="d{{i|add:-1}}"> =  <!-- id使用python計算 -->
        <input type="text" id="d{{i}}">  <!-- id使用python計算 -->
        <button class="btn" id="btn{{i}}">計算</button>  <!-- id使用python計算 -->
    {% endfor %}
    {% csrf_token %}  <!-- 新增csrf_token -->
    <script>
        $('.btn').click(function () {
            var csrf = $('input[name="csrfmiddlewaretoken"]').val();  //增加csrf變數將在data中傳參以避免403錯誤
            var btn = $(this).attr('id')  //取id值
            var varnum1 = "#d"+(btn.replace("btn","")-2)  //取id值
            var varnum2 = "#d"+(btn.replace("btn","")-1)  //取id值
            var varnum3 = "#d"+(btn.replace("btn",""))  //取id值
            var num1 = $(varnum1).val()  //取id遞增序號值
            var num2 = $(varnum2).val()  //取id遞增序號值
            var num3 = $(varnum3).val()  //取id遞增序號值
            // 朝後端傳送ajax請求
            $.ajax({
                // 1.指定朝哪個後端傳送ajax請求
                url: '', //不寫就是朝當前地址提交【與form表單的action引數相同】
                // 2.請求方式
                type: 'post',  // 不指定預設就是get,都是小寫
                // 3.資料
                data: { 'num1': num1, 'num2': num2, 'csrfmiddlewaretoken': csrf },
                // 4.回撥函數:當後端給你返回結果的時候會自動觸發,args接受後端的返回結果
                success: function (args) {
                    $(varnum3).val(args)
                }
            })
        })
    </script>
</body>

</html>

輸出效果:分別輸入三組數值,點選不同的計算,非同步計算結果後根據點選的計算返回前端

輸入完成後單資料提交程式碼

urls.py

from django.urls import path
import Public.views

urlpatterns = [
    path('error/',Public.views.error),
]

views.py

def error(request):
    if request.method == 'POST':
        num1 = request.POST.get('num1',0)
        num2 = request.POST.get('num2',0)
        num = int(num1)+int(num2)
        return HttpResponse(str(num))  #POST請求僅返回HttpResponse值
    return render(request, 'error.html')  #GET請求返回error.html介面

error.html #使用error介面進行測試

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <title>error</title>
    <script src="http://ajax.aspnetcdn.com/ajax/jquery/jquery-1.12.4.min.js"></script>
</head>

<body onclick="click()">
    {% for i in '369'|make_list %}
    <!-- for迴圈 -->
    <br> <!-- 增加多個回車是為了明顯顯示是否會重新整理介面 -->
    <input type="text" id="d{{i|add:-2}}"> +
    <!-- id使用python計算 -->
    <input type="text" id="d{{i|add:-1}}"> =
    <!-- id使用python計算 -->
    <input type="text" id="d{{i}}"> <!-- id使用python計算 -->
    <button class="btn" id="btn{{i}}">計算</button> <!-- id使用python計算 -->
    {% endfor %}
    {% csrf_token %}
    <!-- 新增csrf_token -->
    <script>
        $('.btn').click(function () {
            var csrf = $('input[name="csrfmiddlewaretoken"]').val();  //增加csrf變數將在data中傳參以避免403錯誤
            var btn = $(this).attr('id')  //取id值
            var varnum1 = "#d" + (btn.replace("btn", "") - 2)  //取id值
            var varnum2 = "#d" + (btn.replace("btn", "") - 1)  //取id值
            var varnum3 = "#d" + (btn.replace("btn", ""))  //取id值
            var num1 = $(varnum1).val()  //取id遞增序號值
            var num2 = $(varnum2).val()  //取id遞增序號值
            var num3 = $(varnum3).val()  //取id遞增序號值
            // 朝後端傳送ajax請求
            $.ajax({
                // 1.指定朝哪個後端傳送ajax請求
                url: '', //不寫就是朝當前地址提交【與form表單的action引數相同】
                // 2.請求方式
                type: 'post',  // 不指定預設就是get,都是小寫
                // 3.資料
                data: { 'num1': num1, 'num2': num2, 'csrfmiddlewaretoken': csrf },
                // 4.回撥函數:當後端給你返回結果的時候會自動觸發,args接受後端的返回結果
                success: function (args) {
                    $(varnum3).val(args)
                }
            })
        })
    </script>
    <script>
        document.addEventListener("mouseout", function (e) {  //獲取遊標事件
            var num = ($(e.target).attr('id')).replace("d", "").replace("btn", "")  //獲取遊標所在元素id
            if (num % 3 === 0) {
            }
            else if (num % 3 === 1) {
                num = parseInt(num) + 2
            }
            else if (num % 3 === 2) {
                num = parseInt(num) + 1
            }
            varnum = "#btn" + num
            $(varnum).click()
        });
        document.addEventListener("keydown", function (e) {  //獲取按鍵事件
            if ((e.keyCode == 9) || (e.keyCode == 32) || (e.keyCode == 13) || ((((e.keyCode == 83)) && (navigator.platform.match("Mac") ? e.metaKey : e.ctrlKey)))) {  //當按鍵為Tab、Enter、Space、Ctrl+S時執行操作
                var num = (document.activeElement.id).replace("d", "").replace("btn", "")  //獲取所在位置元素id
                if (num % 3 === 0) {
                }
                else if (num % 3 === 1) {
                    num = parseInt(num) + 2
                }
                else if (num % 3 === 2) {
                    num = parseInt(num) + 1
                }
                varnum = "#btn" + num
                $(varnum).click()
            }
        });
    </script>
</body>

</html>

輸出效果:值輸到哪裡,哪裡就會顯示出結果,無須點選計算按鈕

最後把計算按鈕隱藏一下

    <button hidden class="btn" id="btn{{i}}">計算</button> <!-- id使用python計算 -->

本來還想做一下一鍵全部提交程式碼、輸入完成後全資料提交程式碼兩個功能,但發現這樣要提交的post值太多了,還是一次提交單個或單行資料比較靠譜

參考連結:

  • https://www.cnblogs.com/yangyi215/p/14964897.html
  • https://www.cnblogs.com/oldpai/p/9637774.html

總結 

到此這篇關於Django中使用AJAX的文章就介紹到這了,更多相關Django使用AJAX內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com