2014-03-04 75 views
2

我正在用Django創建一個網站,並且我希望用戶能夠按下一個按鈕,該按鈕會將一些數據發送到我的服務器,例如將條目添加到數據庫與HTTP發佈請求。我可以通過創建一個HTML表單來實現這一點,並在action屬性中指向一個將執行數據處理的視圖,然後渲染一個模板。Django:將數據發送到服務器而不呈現新模板

但是,如果我不想渲染模板會怎麼樣?如果我希望用戶單擊按鈕來處理服務器上的某些數據,但我不想通過視圖函數呈現新模板,那麼這怎麼做呢?我想在瀏覽器中維護當前呈現的HTML,但我知道將數據發送到服務器的唯一方法是在視圖函數中渲染一個新模板。

任何幫助?謝謝。

回答

1

Django沒有說視圖必須呈現模板。這只是視圖可以做的許多事情之一。一個視圖只需要返回一個HttpResponse

HttpResponse正文是否包含HTML等完全取決於您。您也不需要表單將數據發佈到您的服務器。您可以簡單地使用JavaScript發送任何您需要的任意數據。您仍然可以使用輸入,textarea等表單元素;它們不必包含在表單元素中才能生效。

爲了讓答案更簡短,您需要使用JavaScript通過ajax將數據發送到您的Django應用程序,處理數據並返回JSON或XML格式的響應,然後您可以使用它來更新頁面,等等。你可以寫vanilla JavaScript來做到這一點,或者利用像jQuery這樣的圖書館,或者如果你真的很懶,你可以使用類似Dajax的東西。

0

只需從您的視圖中返回204 No Content答案。

+0

Karnivaurus,這是另一種完全合法的方式你觀點來回應。這取決於你的用例。 @neoascetic,也是很好的答案。 – Brandon

0

正如我在我之前對你的回答中所說的,在Django中這樣做的正常方式是發佈到相同的視圖,該視圖接受數據,然後重新呈現相同的模板(例如顯示錯誤)或重定向到另一個URL。

另一種方法是使用Ajax進行發佈。

+0

謝謝 - 會重新渲染完全相同的頁面而不是返回204無內容響應?例如,如果網頁上有大量圖像,則僅從服務器重新加載全部圖像似乎效率低下。 – Karnivaurus

0

您可以通過向服務器發送ajax請求來實現此目的。
這裏你需要編寫一個ajax請求,它會執​​行django視圖並將響應返回到json,xml格式。
您可以根據需要在模板中顯示最新數據。
Ajax請求

 
function mail_check() { 
var val = $("#val").val(); 
$.getJSON('/test/'+val+"/", 

function(data) { 
// render changes content  
});} 

Django的視圖

 
def checkemailavailability(request, val): 
    message = {'result':''} 
    if request.is_ajax(): 
     # put logic here 
     #json = simplejson.dumps() convert data into json 
     return HttpResponse(json, mimetype='application/json') 

注意:不要忘了包括jquery
鏈接:stackoverflowtangowith djangobradmontgomery.net

相關問題