Tengo una aplicación django con varias vistas que aceptan objetos json mediante solicitudes POST. Los objetos JSON son de tamaño complejo con unas pocas capas de anidación, así que estoy usando la biblioteca JSON para analizar raw_post_data, como se muestra aquí:django: Prueba de vistas basadas en POST con objetos json
def handle_ajax_call(request):
post_json = json.loads(request.raw_post_data)
... (do stuff with json query)
A continuación, Quiero escribir pruebas para estos puntos de vista. Lamentablemente, no puedo entender cómo pasar el objeto json al cliente. Aquí hay una versión más simple de los casos de mi código:
def test_ajax_call(self):
c = Client()
call_command('loadfixtures', 'temp-fixtures-1') #Custom command to populate the DB
J = {
some_info : {
attr1 : "AAAA",
attr2 : "BBBB",
list_attr : [ "x", "y", "z" ]
},
more_info : { ... },
info_list : [ 1, 22, 23, 24, 5, 26, 7 ]
}
J_string = json.dumps(J)
response = c.post('/ajax/call/', data=J_string)
Cuando ejecuto la prueba, falla con:
AttributeError: 'str' object has no attribute 'items'
¿Cómo puedo pasar el objeto JSON en el método Client.post?
Awesome! Gracias por decodificar la letra pequeña en la documentación. Nunca menciona específicamente a json, por lo que no aparecía en ninguna de mis búsquedas. – Abe
Tenga en cuenta que para este caso de uso particular, la solicitud.is_ajax() probablemente no funcione. Entonces, si está utilizando algo como 'application/json' en request.META ['CONTENT_TYPE'] para detectar si la llamada es Ajax, la solución de Daniel tiene el beneficio adicional de establecer correctamente el encabezado del tipo de contenido. –
Esta es la información de la publicación que recibo al agregar ese tipo de contenido: ' ', por lo que todos los datos se convierten en la clave eso no parece correcto –
Hassek