2012-06-24 14 views
9

Estoy tratando de pasar una lista de valores numéricos (ids) de una página web a otra con la llamada jQuery ajax. No puedo entender cómo pasar y leer todos los valores en la lista. Puedo publicar y leer con éxito 1 valor pero no valores múltiples. Aquí es lo que tengo hasta ahora:Pasando la lista de valores a la vista django a través de jQuery ajax call

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); 
      } 
    });  
}); 

/ingredientes/foto:

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) 

Con Firebug puedo ver que la POST contiene tanto los identificadores pero probablemente en el formato incorrecto (terid = 1 & terid = 2). Entonces mi vista de ingredientes toma solo terid = 2. ¿Qué estoy haciendo mal?

EDIT: Para aclarar, necesito los valores de paso variable de ourid [1, 2] para el filtro en la vista de ingredientes.

Respuesta

3

he encontrado una solución al problema original. Publicarlo aquí como una respuesta, con suerte, ayuda a alguien.

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); 
      } 
    });  
}); 

/ingredientes/vista:

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

Solo un FYI: algunos navegadores antiguos no tienen una biblioteca JSON incorporada.Usted * podría * estar mejor usando '$ .serialize' en lugar de' JSON.stringify' –

0

enviar Trate de datos como este:

data: values; 
2

Esta parte es su problema:

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

Se necesitan deserializar la cadena JSON.

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

Cuando hago eso obtengo este error en la devolución de llamada de ajax: TypeError at/ingredients/ 'int' object no es iterable – finspin

+0

Esto resolvió mi problema, lección aprendida. –

1

Parece que está configurando la matriz de cadena aquí

data: {'terid': values}, 

Debe ser

data: {terid: values} 
+0

Todavía solo se recoge el segundo valor (terid = 2). – finspin

28

Puede acceder a esta matriz por request.POST.getlist ('terid []') en la vista

en javascript:

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

en view.py:

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

Funciona perfecto para mí.

+2

+1 solución muy KISS – andi

+1

+1 para KISS sobre KISS Solution. – doniyor

+0

'selected = request.GET.getlist ['selected []'] TypeError: el objeto 'instancemethod' no tiene el atributo '__getitem__' 'Recibo este error ... Pero tengo una serie de picaduras como [" one "] , "dos", "tres"] y estoy usando una petición 'GET' ... – nidHi

Cuestiones relacionadas