2012-01-29 8 views
9

Nella mia funzione di visualizzazione, mi piacerebbe restituire un oggetto json (data1) e un testo/html (modulo). È possibile?E 'possibile restituire una HttpResponse in django con testo e un oggetto json?

Ecco parte della mia 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: 
... 

mi piacerebbe rispedire sia la forma HTML e l'oggetto ques1 JSON. Come posso fare questo? Grazie in anticipo.

risposta

0

Per fare ciò con una risposta; è necessario inviare il JSON come testo normale nel contesto della risposta del modello (HTML).

Se è necessario inviare JSON come un oggetto JSON separato, con il proprio tipo MIME, è necessario scrivere due viste; uno che rimanda il JSON come application/json e l'altro che rimanda il modulo (HTML).

EDIT:

Non state restituendo oggetti JSON, ma si stanno trasformando un dizionario che ha due elementi di due tipi diversi. Come ho spiegato nei commenti, in un ciclo di richiesta/risposta; puoi solo restituire una risposta che ha uno specifico tipo MIME basato sul contenuto e su come il browser deve gestirlo. Il più delle volte il tipo di contenuto è 'text/html'.

Nel tuo scenario, se vuoi restituire sia l'HTML (che è il tuo modulo), sia la risposta JSON (che è una stringa), devi restituire HTML.

Se si desidera restituire JSON a Jquery come oggetto JSON; è necessario rilevare il tipo di richiesta. Nel front-end (i modelli), si avvieranno due richieste, una dal browser, che restituirà il modulo. L'altro da jQuery, che restituirà l'oggetto JSON appropriato.

Ecco un possibile approccio a questo:

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

Giusto per essere chiari al 100% - io mando un HttpRequest richiesta POST con i dati del modulo (tramite ajax), quindi posso solo indirizzarlo a una funzione di visualizzazione. Nel mio scenario, quando l'utente invia una risposta a una domanda, mi piacerebbe prendere in quei dati, fare cose con esso, e quindi inviare un'altra domanda json oggetto e un nuovo modulo di input. –

+0

È possibile restituire una risposta, con più oggetti nel contesto. Questo può essere di un solo _mime type_ - in modo che tu possa inviare più oggetti in una risposta; ma tu * non puoi * combinare due tipi MIME in una sola risposta. Nell'esempio si imposta il mimetype come 'application/json'. Puoi tecnicamente inviare tutto ciò che vuoi e inserire il mimetype come vuoi, ma questo non farà ciò che desideri sul client. Per inviare l'HTML per il modulo e l'oggetto JSON: aggiungere l'oggetto JSON al contesto della risposta. –

+0

Si prega di controllare il codice modificato sopra. Ho aggiunto sia il modulo che l'oggetto json al contesto, e lo rimando indietro. È ciò che intendi? L'oggetto json leggerà correttamente sul lato client (sto usando jquery)? Leggere questo dal lato del cliente sarà un po 'un incubo, penso. Non ho usato RequestContext poiché ci sono molte più variabili che vengono restituite che non ho bisogno. Grazie per l'aiuto. –

9

Basta mettere entrambe le parti di dati in un contenitore JSON, una chiave con i dati del modulo e uno con il codice HTML come una stringa resa. Nel browser, puoi semplicemente estrarre entrambe le chiavi da & fare le tue cose.

Secondo lei:

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") 

In js:

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

Ho provato quello che mi hai suggerito, ma il problema è che 'ques1' sopra è un queryset, e json.dumps lamenta che non è possibile serializzare questo queryset. In realtà, si lamenta anche se si tenta di serializzare solo l'oggetto ('test1'). Inoltre, nel mio codice sopra, le due cose che vorrei inviare sono la forma e l'oggetto domanda. –

+2

Beh, sì, non puoi serializzare in Python oggetti Python. Non è possibile inviare "l'oggetto domanda" di per sé; puoi solo inviare un dict JSON degli attributi dell'oggetto. Django ha un [assistente di serializzazione incorporato] (https://docs.djangoproject.com/en/dev/topics/serialization/#serializing-data) in grado di gestire i set di query. – AdamKG

3

Usa JsonResponse

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