Django使用AJAX向服務(wù)器發(fā)起請(qǐng)求的操作方法
什么是AJAX?
AJAX(Asynchronous JavaScript and XML)是一種用于創(chuàng)建交互式網(wǎng)頁應(yīng)用程序的技術(shù),它允許在不重新加載整個(gè)頁面的情況下向服務(wù)器發(fā)送和接收數(shù)據(jù)。通過 AJAX,網(wǎng)頁可以異步地向服務(wù)器發(fā)起請(qǐng)求并在后臺(tái)進(jìn)行處理,然后在不刷新頁面的情況下更新頁面的部分內(nèi)容。
具體來說,AJAX 主要由以下幾個(gè)核心技術(shù)組成:
- JavaScript:AJAX 的核心是 JavaScript,它負(fù)責(zé)在客戶端(瀏覽器)發(fā)起請(qǐng)求、處理響應(yīng),并更新頁面的內(nèi)容。
- XMLHttpRequest對(duì)象(XHR):XHR 是在 JavaScript 中用于向服務(wù)器發(fā)起 HTTP 請(qǐng)求和接收響應(yīng)的對(duì)象。通過 XHR,JavaScript 可以在后臺(tái)與服務(wù)器進(jìn)行通信,獲取數(shù)據(jù)并更新頁面。
- HTML(或XML):通常情況下,服務(wù)器響應(yīng)會(huì)以 HTML 或 XML 格式返回?cái)?shù)據(jù)。HTML 格式的響應(yīng)可以直接用于更新頁面的內(nèi)容,而 XML 格式的響應(yīng)通常需要 JavaScript 進(jìn)行解析后再進(jìn)行處理。
- CSS:有時(shí)候,也會(huì)使用 CSS 來實(shí)現(xiàn)頁面的動(dòng)態(tài)效果,以增強(qiáng)用戶體驗(yàn)。
AJAX 技術(shù)的主要優(yōu)點(diǎn)包括:
- 提升用戶體驗(yàn):通過異步加載數(shù)據(jù),可以減少頁面的加載時(shí)間和帶寬消耗,從而提升用戶體驗(yàn)。
- 減少服務(wù)器負(fù)載:不需要重新加載整個(gè)頁面,可以減少服務(wù)器的請(qǐng)求量,降低服務(wù)器負(fù)載。
- 增強(qiáng)頁面交互性:可以在不刷新整個(gè)頁面的情況下動(dòng)態(tài)地更新頁面的部分內(nèi)容,增強(qiáng)了頁面的交互性和實(shí)時(shí)性。
總的來說,AJAX 技術(shù)使得網(wǎng)頁能夠更快速、更動(dòng)態(tài)地與用戶交互,為用戶提供更加流暢和友好的使用體驗(yàn)。
實(shí)例
在網(wǎng)頁頁面有一個(gè)信息列表,點(diǎn)擊列表中的編輯圖標(biāo)后,向服務(wù)器發(fā)送請(qǐng)求,由視圖函數(shù)處理后,更新數(shù)據(jù)庫記錄,并且刷新頁面。
1、html文件,及其中的腳本語言如下:
<table class="table table-hover">
<tr>
<td>序號(hào)</td>
<td>欄目名稱</td>
<td>操作</td>
</tr>
{% for column in columns %}
<tr>
<td>{{ forloop.counter }}</td>
<td>{{ column.column }}</td>
<td>
<a name="edit" href="javascript:" rel="external nofollow" rel="external nofollow" onclick="edit_column(this, {{ column.id }})">
<span class="fas fa-pencil-alt"></span>
</a>
<a name="delete" href="javascript:" rel="external nofollow" rel="external nofollow" onclick="del_column(this, {{ column.id }})">
<span class="fas fa-trash-alt" style="margin-left: 20px;"></span>
</a>
</td>
</tr>
{% empty %}
<p>還沒有設(shè)置欄目,太懶了。</p>
{% endfor %}
</table><script>
function edit_column(element, columnId) {
// 獲取當(dāng)前行的文檔名稱單元格
const currentRow = element.closest('tr');
const nameCell = currentRow.querySelector('td:nth-child(2)');
// 獲取當(dāng)前文檔名稱
const currentName = nameCell.textContent;
// 彈出 Prompt 對(duì)話框,獲取新的文檔名稱
const newName = prompt('請(qǐng)輸入新的欄目名稱:', currentName);
// 如果用戶點(diǎn)擊了確定并輸入了新名稱,更新表格中的文檔名稱
if (newName !== null && newName.trim() !== '') {
const trimmedName = newName.trim();
// 發(fā)送 AJAX 請(qǐng)求更新數(shù)據(jù)庫,在fetch后支出了提交的url,由該url確定由那個(gè)view函數(shù)處理提交
fetch(`/article/update-column/`, {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'X-CSRFToken': getCookie('csrftoken') // Django 的 CSRF token
},
body: JSON.stringify({
current_name: currentName,
new_name: trimmedName
}) //發(fā)送到后臺(tái)的是一個(gè)字典,鍵current_name值是column的舊名稱,鍵new_name值是column的新名稱
}).then(response => {
if (response.ok) {
// 更新成功,更新表格中的文檔名稱
nameCell.textContent = trimmedName;
alert('欄目名稱更新成功');
} else {
// 更新失敗,處理錯(cuò)誤
alert('更新失敗,請(qǐng)重試');
}
}).catch(error => {
console.error('Error:', error);
alert('更新失敗,請(qǐng)重試');
});
}
}
function del_column(element, columnId) {
// 實(shí)現(xiàn)刪除功能的邏輯
console.log('刪除欄目 ID:', columnId);
}
// 獲取 CSRF token 的函數(shù)(Django)
function getCookie(name) {
let cookieValue = null;
if (document.cookie && document.cookie !== '') {
const cookies = document.cookie.split(';');
for (let i = 0; i < cookies.length; i++) {
const cookie = cookies[i].trim();
if (cookie.substring(0, name.length + 1) === (name + '=')) {
cookieValue = decodeURIComponent(cookie.substring(name.length + 1));
break;
}
}
}
return cookieValue;
}
</script>2、view函數(shù)如下
@csrf_exempt
@login_required
def update_column(request):
if request.method == 'POST':
try:
data = json.loads(request.body)
current_name = data.get('current_name') #提交數(shù)據(jù)字典中的current_name
new_name = data.get('new_name') #提交數(shù)據(jù)字典中的new_name
changed_column = ArticleColumn.objects.get(user = request.user, column=current_name)
changed_column.column = new_name
changed_column.save()
return JsonResponse({'status': 'success'})
except ArticleColumn.DoesNotExist:
return JsonResponse({'status': 'error', 'message': 'ArticleColumn not found'}, status=404)
except Exception as e:
return JsonResponse({'status': 'error', 'message': str(e)}, status=500)
return JsonResponse({'status': 'error', 'message': 'Invalid request method'}, status=400)3、url如下
path('update-column/', views.update_column, name='update_column'),到此這篇關(guān)于Django使用AJAX向服務(wù)器發(fā)起請(qǐng)求的文章就介紹到這了,更多相關(guān)Django服務(wù)器發(fā)起請(qǐng)求內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Ajax請(qǐng)求二進(jìn)制流進(jìn)行處理(ajax異步下載文件)的簡單方法
最近做項(xiàng)目遇到這樣的需求:管理后臺(tái)需要隨時(shí)下載數(shù)據(jù)報(bào)表,數(shù)據(jù)要實(shí)時(shí)生成后轉(zhuǎn)換為excel下載。怎么解決這個(gè)問題呢?下面小編給大家分享Ajax請(qǐng)求二進(jìn)制流進(jìn)行處理(ajax異步下載文件)的簡單方法,一起看看吧2017-09-09
Ajax讀取數(shù)據(jù)到表格的實(shí)現(xiàn)代碼
前兩篇我們講了"ajax開始的準(zhǔn)備"與及如何使用ajax技術(shù)進(jìn)行簡單的數(shù)據(jù)讀?。裉煳覀円v的是:使用Ajax無刷新技術(shù)讀取服務(wù)端多條數(shù)據(jù),并將返回的數(shù)據(jù)顯示到一個(gè)表格內(nèi).2010-08-08
ajax用json實(shí)現(xiàn)數(shù)據(jù)傳輸
本文主要介紹了ajax用json實(shí)現(xiàn)數(shù)據(jù)傳輸?shù)姆椒?,具有很好的參考價(jià)值。下面跟著小編一起來看下吧2017-03-03

