2012-01-29 32 views
9

En mi función de vista, me gustaría devolver un objeto json (data1) y algo de texto/html (formulario). es posible?¿Es posible devolver un HttpResponse en django con texto y un objeto json?

Aquí es parte de mi views.py:

if request.is_ajax() and request.method == 'POST': 
... 
    if form.is_valid(): 
     answer = form.cleaned_data['answer'] # Answer extracted from form is also a string 
     a1 = ques1.correct_answer 
        if a1 == answer: 
      test1 = question_list.get(id=nextid) 
      form = AnswerForm(test1) 
      ques1 = question_list.filter(id=nextid)      # Filter next question as <qs> 
      data1 = serializers.serialize("json",ques1)     # Json-ize 
    # ********EDITED HERE **********   
      variables1 = Context({ 
       'form' : form, 
       'q1' : data1, 
      }) 
      #response = HttpResponse() 
      #response['data1'] = response.write(data1) 
      #response['form'] = response.write(form) 
      if nextid <= qsnlen: 
       return HttpResponse(variables1, mimetype="application/json") 
       #return HttpResponse(response) 
      else: 
... 

me gustaría que enviar tanto el formulario HTML y el objeto ques1 JSON. ¿Cómo puedo hacer esto? Gracias por adelantado.

Respuesta

0

Para hacer esto con una sola respuesta; debe enviar el JSON como texto sin formato en el contexto de la respuesta de su plantilla (HTML).

Si necesita enviar JSON como un objeto JSON separado, con su propio tipo mime, debe escribir dos vistas; uno que devuelve el JSON como application/json y el otro que devuelve el formulario (HTML).

EDIT:

No está devolviendo objetos JSON, pero que está girando un diccionario que tiene dos elementos de dos tipos diferentes. Como expliqué en los comentarios, en un ciclo de solicitud/respuesta; solo puede devolver una respuesta que tiene un tipo de mime específico basado en el contenido y cómo desea que el navegador lo maneje. La mayoría de las veces, el tipo de contenido es 'text/html'.

En su escenario, si desea devolver tanto el HTML (que es su formulario) como la respuesta JSON (que es una cadena), debe devolver HTML.

Si desea devolver JSON a Jquery como un objeto JSON; necesita detectar el tipo de solicitud. En su interfaz (las plantillas), iniciará dos solicitudes, una desde el navegador, que devolverá el formulario. El otro de jQuery, que devolverá el objeto JSON apropiado.

Aquí es un posible enfoque para esto:

def foo(request): 
    if request.is_ajax(): 
     ctx = dict() 
     ctx['hello'] = 'world' 
     return HttpResponse(json.dumps(ctx),content_type='application/json') 
    else: 
     return HttpResponse('hello world') 
+0

sólo para estar 100% claro - Estoy enviando una solicitud POST HttpRequest con los datos del formulario (a través de ajax), así que solo puedo enrutarlo a una función de vista. En mi escenario, cuando el usuario envía una respuesta a una pregunta, me gustaría tomar esa información, hacer cosas con ella, y luego devolver otra pregunta objeto json y un nuevo formulario de entrada. –

+0

Puede devolver una respuesta, con múltiples objetos en el contexto. Esto puede ser de solo un _mime type_ - para que pueda enviar múltiples elementos en una respuesta; pero * no puede * combinar dos tipos de mime en una respuesta. En su ejemplo, está configurando el tipo mimetype como 'application/json'. Puedes enviar técnicamente lo que quieras y poner el tipo MIME como lo que sea, pero esto no hará lo que quieras en el lado del cliente. Para enviar el HTML para el formulario y el objeto JSON, agregue el objeto JSON al contexto de la respuesta. –

+0

Por favor, compruebe el código editado arriba. Agregué tanto la forma como el objeto json al contexto, y lo estoy enviando de regreso. ¿Es esto lo que quieres decir? ¿El objeto json se leerá correctamente en el lado del cliente (estoy usando jquery)? Leer esto por el lado del cliente será un poco una pesadilla, creo. No usé RequestContext porque hay muchas más variables que se devuelven que no necesito. Gracias por tu ayuda. –

9

sólo hay que poner las dos piezas de datos JSON en un recipiente, una clave con los datos del formulario y uno con el HTML como una cadena prestado. En el navegador, puede sacar ambas claves & haga lo suyo.

En su opinión:

form_json_data = get_form_json_data() 
rendered_html = get_the_html() 
return HttpResponse(json.dumps({ 
     "formdata": form_json, 
     "html": rendered_html}), 
    content_type="application/json") 

En JS:

$.post(foo, postdata, function(data){ 
    var formdata = data.formdata 
    var html = data.html; 
    $(".html-target").replaceWith(html); 
    do_whatever(formdata); 
}) 
+0

Intenté con lo que sugirió, pero el problema es que 'ques1' anterior es un conjunto de consultas, y json.dumps se queja de que no puede serializar este conjunto de preguntas. De hecho, se queja incluso si intenta serializar solo el objeto ('test1'). Además, en mi código anterior, las dos cosas que me gustaría devolver son la forma y el objeto de la pregunta. –

+2

Bueno, sí, no puedes serializar JSON objetos de Python. No puede enviar 'el objeto de pregunta', per se; solo puede enviar un dict de JSON de los atributos del objeto. Django tiene un [asistente de serialización incorporado] (https://docs.djangoproject.com/en/dev/topics/serialization/#serializing-data) que puede manejar querysets. – AdamKG

3

Uso JsonResponse

from django.http import JsonResponse 
response_data = {put your data into a dict} 
return JsonResponse(response_data, status=201) 
Cuestiones relacionadas