2014-07-19 56 views
0

對Ajax不熟悉,所以我試圖讓我的頭部纏繞在東西上。我試圖通過將我的Javascript事件處理程序連接到span元素的onclick來進行Ajax調用。我的模板中沒有表單元素。是否有可能在Django中沒有表單元素的情況下進行Ajax調用?從我的理解是,但我似乎無法讓它工作。當我在視圖中查看請求時,沒有HTTP_X_REQUESTED_WITH標頭,因此request.is_ajax()調用始終返回false。在沒有表格的情況下在Django中調用Ajax

這裏是我的模板的相關部分:

<td><span class="header" onclick="sort_user_table('username')"><a href="">Username</a></span></td> 

這是我的JavaScript函數:

function sort_user_table(col_name) { 
    $.ajax({ 
    url: "/listusers/", 
    data: {sort_order: col_name}, 
    headers: {'HTTP_X_REQUESTED_WITH': 'XMLHttpRequest'}, 
    type: "GET", 
    dataType : "json", 
    success: function(json) { 
     alert('json = ' + json); 
    }, 
    }); 
} 

這是我的觀點:

def list_users_page(request): 
    if request.is_ajax(): 
    sort_order = request.GET['sort_order'] 
    users = User.objects.all().order_by(sort_order) 
    data = serializers.serialize('json', users) 
    json_users = json.dumps(data) 
    return HttpResponse(json_users, mimetype='application/json') 
    else: 
    users = User.objects.all().order_by('last_name') 
    variables = RequestContext(request, { 
     'users': users, 
    }) 
    return render_to_response('users_page.html', variables) 

回答

1

好吧,所以我想清楚發生了什麼事。我在發佈我的模板代碼時犯了一個錯誤,因此它沒有完成(我試圖簡短一些,但最後卻忽略了一個重要的信息)。以下是真實代碼的樣子:

<td><span class="header" onclick="sort_user_table('username')"><a href="">Username</a></span></td> 

href是導致此問題的原因。由於它實際上是一個鏈接,因此當我點擊用戶名span元素時,正在對新資源發出請求。因此,雖然JavaScript代碼正在執行,但它實際上並不是一個Ajax請求,而是一個簡單的HTTP請求。如果我只是從span元素中刪除href,則一切都按預期工作。 HTTP_X_REQUESTED_WITH頭被髮送,我的Django視圖響應爲request.is_ajax()

0

有幾件事情你可能需要更改:

  1. 它看起來像你使用jQuery來進行AJAX調用。如果是這樣的話,那麼你不需要手動添加任何頭文件來讓服務器認爲它是一個AJAX調用,因爲jQuery會自動執行該調用。

  2. 在你看來,你在呼喚Users.objects.all()request.is_ajax塊(注意尾隨sUsers),但User.objects.all()else塊,所以有可能你碰到了問題,是因爲一個無效的調用Users的。

我也建議使用瀏覽器可請求檢查工具檢查請求頭,如果是正確形成的一切,它會顯示你的。

除了success之外,您還應該在您的AJAX請求選項中添加一個error回調函數,以便您可以獲取有關失敗請求的更多信息。

+0

感謝您的建議。 'request.is_ajax'塊中的'Users'是一個錯字,我的代碼確實是'User.objects.all'。爲了簡潔,我省略了錯誤回調。當我插入並檢查錯誤時,它僅僅是「錯誤」消息,不是很有幫助。我按照你的建議做了,並檢查了請求標題,HTTP_X_REQUESTED_WITH標題不在請求中。 – nucklehedd

相關問題