2009-10-02 47 views
0

如何設計一個Django/Javascript應用程序來爲傳統的HTTP請求提供條件Ajax響應?Can Django/Javascript可以處理HTTP POST請求的條件「Ajax」響應嗎?

在服務器上,我有一個自定義的Form對象。當瀏覽器提交表單的數據時,服務器會根據現有數據和規則檢查提交的數據(例如,如果表單將某個實體添加到數據庫中,那麼該實體是否已經存在於數據庫中?)。如果數據通過,服務器將保存,生成一個ID號並將其添加到表單的數據,並將表單和數據傳回給瀏覽器。

if request.method == 'POST': 
    formClass = form_code.getCustomForm() 
    thisForm = formClass(data=request.POST) 
    if thisForm.isvalid(): 
     saveCheck = thisForm.saveData() 
     t = loader.get_template("CustomerForm.html") 
     c = Context({ 'expectedFormObj': thisForm }) 

(請注意,我的自定義邏輯檢查是在SAVEDATA(),是由()由參考isValid完成的HTML驗證分開。)

到目前爲止,標準的Django(我希望)。但是如果數據不通過,我想發送一條消息給瀏覽器。我想saveData()可以將消息放入表單的屬性中,模板可以檢查該屬性,將其數據嵌入爲javascript變量,幷包含一個javascript函數以顯示消息。但是將所有形式的html傳遞回來,只是添加一條消息,似乎不夠雅觀(標準的Django表單提交過程也是如此,但沒關係)。在這種情況下,我想只傳回消息。

現在我想我可以將一個Javascript函數綁定到html表單的onsubmit事件,並且發出一個XMLHttpRequest,並讓服務器根據saveData()調用的輸出做出響應。但是,然後瀏覽器向未完成服務器發送兩個請求(POST和XHR)。也許一個成功的saveData()會重寫整個頁面並消除任何衝突的可能性。但我還得讓服務器按照對POST的響應順序排列對XHR的響應,並找出如何將saveData結果傳遞給對XHR的響應。我想這是可行的,即使沒有線程編程我不知道,但它似乎凌亂。

我推測我可能會使用JavaScript來使瀏覽器的響應有條件地響應POST請求(重寫整個頁面或僅顯示一條消息)中的某些內容。但我懷疑這個頁面的javascript手會通過POST請求控制瀏覽器,並且對POST的任何響應都會重寫頁面。

所以,我可以設計一個進程,只有在服務器端saveData()工作時才傳回整個表單,並且如果saveData()沒有重寫整個表單而顯示的消息不會顯示?如果是這樣,怎麼樣?

+1

這可能太長。 – chernevik 2009-10-02 18:12:02

回答

3

儘管你可以安排你的意見,以檢查請求數據,如果反應來決定應該是一個AJAX或簡單的HTML,我不推薦它。把AJAX請求處理程序放在一個單獨的URL結構中,例如,所有常規的HTML視圖都有像/ foo/bar這樣的URL和一個相應的API調用相同的信息be/ajax/foo/bar。

由於大多數視圖都會檢查請求數據,然後進行一些處理,然後創建一個python字典並將其傳遞給模板引擎,可以將通用部分分解爲t他更容易一點。前幾個步驟可能是一個通用的函數,它只是返回python字典,然後通過將處理函數包裝到模板渲染器或json編碼器中來組成實際的響應。

我通常的工作流程是最初假定客戶端沒有javascript(這仍然是一個有效的假設;許多移動瀏覽器沒有JS),並將該應用程序實現爲靜態的GETPOST處理程序。從那裏我開始尋找我的應用程序可以從小客戶端腳本中受益的地方。例如,我通常會重新設計通過AJAX類型調用提交的表單,而無需重新加載頁面。這些不會將它們的請求發送到與純HTML表單版本相同的URL/django視圖,因爲響應需要是純文本或html片段中的簡單成功消息。

同樣,從服務器獲取數據也被重新設計,用一個簡潔的JSoN文檔來處理客戶端頁面。這也將是一個單獨的URL/django視圖,作爲該資源的相應純HTML。

+0

謝謝 - 正如我發佈的,整個事情聽起來像一個壞主意。兩個問題。 1)我只是一個雞蛋,不要吝嗇「API調用」。這會引用Ajax函數嗎? 2)據我瞭解第二段,服務器將重新發送表單的所有html,並根據需要添加其他位。是? – chernevik 2009-10-02 18:40:57

3

當AJAX處理,我用這個:

from django.utils import simplejson 
... 
status = simplejson.dumps({'status': "success"}) 
return HttpResponse(status, mimetype="application/json") 

然後,AJAX(jQuery的)可以做的基礎上, '狀態' 的返回值是什麼就是了。

我不確定你想要的表格。如果你想要一個更簡單,更好的形式體驗,我建議查看uni-formPinax在他們的投票應用程序中有很好的實現。