2012-06-24 41 views
9

Tôi đang cố chuyển danh sách các giá trị số (id) từ trang này sang trang khác với cuộc gọi jQuery ajax. Tôi không thể tìm ra cách để vượt qua và đọc tất cả các giá trị trong danh sách. Tôi có thể đăng và đọc thành công 1 giá trị chứ không phải nhiều giá trị. Dưới đây là những gì tôi có cho đến nay:Chuyển danh sách các giá trị sang chế độ xem django qua cuộc gọi jQuery ajax

jQuery:

var postUrl = "http://localhost:8000/ingredients/"; 
$('li').click(function(){ 
    values = [1, 2]; 
    $.ajax({ 
     url: postUrl, 
     type: 'POST', 
     data: {'terid': values}, 
     traditional: true, 
     dataType: 'html', 
     success: function(result){ 
      $('#ingredients').append(result); 
      } 
    });  
}); 

/thành phần/xem:

def ingredients(request): 
    if request.is_ajax(): 
     ourid = request.POST.get('terid', False) 
     ingredients = Ingredience.objects.filter(food__id__in=ourid) 
     t = get_template('ingredients.html') 
     html = t.render(Context({'ingredients': ingredients,})) 
     return HttpResponse(html) 
    else: 
     html = '<p>This is not ajax</p>'  
     return HttpResponse(html) 

Với Firebug Tôi có thể thấy rằng POST chứa cả id nhưng có lẽ trong định dạng sai (terid = 1 & terid = 2). Vì vậy, thành phần của tôi xem chỉ chọn terid = 2. Tôi đang làm gì sai?

EDIT: Để làm rõ, tôi cần giá trị biến biến ourid [1, 2] vào bộ lọc trong chế độ xem thành phần.

Trả lời

3

Tôi tìm thấy một giải pháp cho vấn đề ban đầu của tôi. Đăng nó ở đây như một câu trả lời, hy vọng nó sẽ giúp ai đó.

jQuery:

var postUrl = "http://localhost:8000/ingredients/"; 
$('li').click(function(){ 
    values = [1, 2]; 
    var jsonText = JSON.stringify(values); 
    $.ajax({ 
     url: postUrl, 
     type: 'POST', 
     data: jsonText, 
     traditional: true, 
     dataType: 'html', 
     success: function(result){ 
      $('#ingredients').append(result); 
      } 
    });  
}); 

/thành phần/xem:

def ingredients(request): 
    if request.is_ajax(): 
     ourid = json.loads(request.raw_post_data) 
     ingredients = Ingredience.objects.filter(food__id__in=ourid) 
     t = get_template('ingredients.html') 
     html = t.render(Context({'ingredients': ingredients,})) 
     return HttpResponse(html) 
    else: 
     html = '<p>This is not ajax</p>'  
     return HttpResponse(html) 
+0

Chỉ cần một FYI - một số trình duyệt cũ hơn không có thư viện JSON tích hợp sẵn.Bạn * có thể * nên sử dụng '$ .serialize' hơn là' JSON.stringify' –

0

Hãy thử gửi dữ liệu như thế này:

data: values; 
2

phần Đây là vấn đề của bạn:

ourid = request.POST.get('terid', False) 
ingredients = Ingredience.objects.filter(food__id__in=ourid) 

Bạn cần phải deserialize chuỗi JSON.

import json 
ourid = json.loads(request.POST.get('terid')) 
+0

Khi tôi làm điều đó tôi nhận được lỗi này trong cuộc gọi lại ajax: LoạiError tại/ingredients/ 'int' đối tượng không thể lặp lại – finspin

+0

Điều này giải quyết được vấn đề của tôi, bài học kinh nghiệm. –

1

Có vẻ như bạn đang thiết mảng chuỗi đây

data: {'terid': values}, 

Nó phải là

data: {terid: values} 
+0

Vẫn chỉ có giá trị thứ hai được chọn (terid = 2). – finspin

28

Bạn có thể truy cập vào mảng này bằng cách request.POST.getlist ('terid []') trong chế độ xem

trong javascript:

$.post(postUrl, {terid: values}, function(response){ 
    alert(response); 
}); 

trong view.py:

request.POST.getlist('terid[]') 

Nó hoạt động hoàn hảo cho tôi.

+2

+1 giải pháp rất KISS – andi

+1

+1 cho KISS về KISS Solution. – doniyor

+0

'selected = request.GET.getlist [‌ 'selected []'] TypeError: đối tượng 'instancemethod' không có thuộc tính '__getitem__'' Tôi nhận được lỗi này ... Nhưng tôi có một mảng stings như ["one" , "hai", "ba" ‌] và đang sử dụng yêu cầu 'GET' ... – nidHi

Các vấn đề liên quan