2012-05-09 12 views
5

Estoy enviando una solicitud POST AJAX usando Angularjs y su módulo $ http al servidor Django. Aquí hay un ejemplo:enviando datos desde angularjs a django

$http({ 
     method: 'POST', 
     url: '/url/', 
     data: 'test data' 
    }). 
    success(function(data, status, headers, config) { 
     doSomeStuffWhenSuccess(); 
    }); 

El problema es lo que obtengo en Django. No importa lo que envíe, la información siempre es la clave del objeto QueryDict y el valor de eso siempre es una lista vacía.

<QueryDict: {u'test data': [u'']}> 

No tengo ni idea de por qué. ¿Qué me estoy perdiendo?

Utilizo la aplicación Django creada casi por defecto con solo middlewares predeterminados. Creé solo una vista y establecí una url en la configuración de url. La versión de Django es 1.3. Y configuré el módulo $ http de angular para enviar siempre un encabezado que contenga el token csrf para satisfacer a Django.

Respuesta

6

Creo que django cree que estás enviando un formulario en urinate, por ejemplo. clave = valor & clave2 = valor2 ...

si iba a tratar:

$http({ 
    method: 'POST', 
    url: '/url/', 
    data: 'test=data' 
}) 

usted debe conseguir

<QueryDict: {u'test': [u'data']}> 

siempre se puede obtener los datos (el contenido del cuerpo en bruto) de la siguiente :

request.body 

Espero que esto es lo que estás buscando.

+0

¡Gracias esto funciona! ¿Pero podría explicar por qué django piensa que su información codificada en urinate? Y si es posible personalizarlo? – davekr

+1

request.GET y request.POST contienen datos preprocesados ​​de clave/valor; si desea datos brutos (como JSON o texto sin formato), intente: request.raw_post_data –

7

Resolví esto con la función jQuery param. Creo que es una solución más elegante.

$http({ 
    method: 'POST', 
    url: '/url/', 
    data: $.param({test: data}) 
}) 

Ahora funciona como yo quería.

Cuestiones relacionadas