2012-01-29 14 views
9

मेरे दृश्य फ़ंक्शन में, मैं एक जेसन ऑब्जेक्ट (डेटा 1) और कुछ टेक्स्ट/एचटीएमएल (फॉर्म) वापस करना चाहता हूं। क्या यह संभव है?क्या टेक्स्ट और जेसन ऑब्जेक्ट के साथ django में एक HttpResponse वापस करना संभव है?

यहाँ मेरी 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: 
... 

मैं वापस दोनों प्रपत्र एचटीएमएल और ques1 json वस्तु भेजना चाहते हैं। मैं यह कैसे कर सकता हूँ? अग्रिम में धन्यवाद।

उत्तर

0

एक प्रतिक्रिया के साथ ऐसा करने के लिए; आपको JS टेम्पलेट को अपने टेम्पलेट प्रतिक्रिया (HTML) के संदर्भ में एक सादे पाठ के रूप में भेजने की आवश्यकता है।

यदि आपको JSON को अपने स्वयं के माइम प्रकार के साथ एक अलग JSON ऑब्जेक्ट के रूप में भेजने की आवश्यकता है, तो आपको दो दृश्य लिखने की आवश्यकता है; एक जो JSON को application/json के रूप में वापस भेजता है और दूसरा जो फॉर्म (HTML) वापस भेजता है।

संपादित करें:

आप JSON ऑब्जेक्ट वापस नहीं कर रहे हैं, लेकिन आप एक शब्दकोश दो अलग अलग प्रकार के दो आइटम नहीं है कि बदल रहे हैं। जैसा कि मैंने टिप्पणियों में एक अनुरोध/प्रतिक्रिया चक्र में बताया है; आप केवल एक प्रतिक्रिया वापस कर सकते हैं जिसमें एक विशिष्ट माइम प्रकार है जो सामग्री पर आधारित है और आप ब्राउज़र को इसे कैसे संभालना चाहते हैं। अधिकांश समय सामग्री प्रकार 'text/html' है।

अपने परिदृश्य में, यदि आप दोनों HTML (जो आपका फॉर्म है), और JSON प्रतिक्रिया (जो एक स्ट्रिंग है) को वापस करना चाहते हैं, तो आपको HTML वापस करने की आवश्यकता है।

यदि आप जेएसओएन को JSON ऑब्जेक्ट के रूप में JSON वापस करना चाहते हैं; आपको अनुरोध प्रकार का पता लगाने की आवश्यकता है। आपके फ्रंट एंड (टेम्पलेट्स) में, आप दो अनुरोध शुरू करेंगे - ब्राउज़र से एक, जो फ़ॉर्म को वापस कर देगा। JQuery से दूसरा, जो उपयुक्त JSON ऑब्जेक्ट वापस करेगा।

यहाँ यह करने के लिए एक संभव तरीका है:

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

बस 100% स्पष्ट होना - मैं प्रपत्र डेटा के साथ एक HttpRequest पोस्ट अनुरोध भेज रहा हूँ (AJAX के माध्यम से), इसलिए मैं इसे केवल एक दृश्य समारोह में रूट कर सकता हूं। मेरे परिदृश्य में, जब उपयोगकर्ता किसी प्रश्न का उत्तर सबमिट करता है, तो मैं उस डेटा को लेना चाहता हूं, इसके साथ चीजें करता हूं, और उसके बाद एक अन्य प्रश्न जेसन ऑब्जेक्ट और एक नया इनपुट फॉर्म भेजता हूं। –

+0

संदर्भ में एकाधिक ऑब्जेक्ट्स के साथ आप एक प्रतिक्रिया वापस कर सकते हैं। यह केवल एक _mime type_ का हो सकता है - ताकि आप प्रतिक्रिया में कई आइटम भेज सकें; लेकिन आप * एक प्रतिक्रिया में दो माइम प्रकारों को गठबंधन नहीं कर सकते हैं। अपने उदाहरण में आप mimetype को 'application/json' के रूप में सेट कर रहे हैं। आप तकनीकी रूप से जो कुछ भी चाहते हैं उसे भेज सकते हैं और माइमटाइप को जो कुछ भी डाल सकते हैं, लेकिन यह क्लाइंट एंड पर जो भी आप चाहते हैं वह नहीं करेगा। फॉर्म और JSON ऑब्जेक्ट के लिए HTML भेजने के लिए - प्रतिक्रिया के संदर्भ में JSON ऑब्जेक्ट जोड़ें। –

+0

कृपया ऊपर संपादित कोड की जांच करें। मैंने संदर्भ में फॉर्म और जेसन ऑब्जेक्ट दोनों को जोड़ा, और मैं इसे वापस भेज रहा हूं। क्या तुम्हारे कहने का मतलब यही था? क्या जेसन ऑब्जेक्ट क्लाइंट साइड पर सही ढंग से पढ़ेगा (मैं jquery का उपयोग कर रहा हूं)? क्लाइंट साइड पर इसे पढ़ना एक दुःस्वप्न का थोड़ा सा होगा, मुझे लगता है। मैंने RequestContext का उपयोग नहीं किया क्योंकि वहां कई और चर हैं जिन्हें वापस लौटाया गया है जिनकी मुझे आवश्यकता नहीं है। आपकी सहायता के लिए धन्यवाद. –

9

बस एक JSON कंटेनर में डेटा के दोनों टुकड़े डाल दिया, प्रपत्र डेटा के साथ एक प्रमुख और एक प्रदान की गई स्ट्रिंग के रूप में HTML के साथ एक। ब्राउज़र में, आप केवल & दोनों चीजों को खींच सकते हैं।

आपके विचार में:

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

js में:

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

मैंने आपके द्वारा सुझाए गए प्रयासों की कोशिश की, लेकिन समस्या यह है कि उपरोक्त 'ques1' एक क्वेरीसेट है, और json.dumps शिकायत करता है कि इस क्वेरीसेट को क्रमबद्ध नहीं किया जा सकता है। वास्तव में, यह शिकायत भी करता है भले ही आप ऑब्जेक्ट ('test1') को क्रमबद्ध करने का प्रयास करें। इसके अलावा, ऊपर दिए गए मेरे कोड में, दो चीजें जिन्हें मैं वापस भेजना चाहता हूं वे फ़ॉर्म और प्रश्न वस्तु हैं। –

+2

वैसे हाँ, आप JSON-Pyialon ऑब्जेक्ट्स को क्रमबद्ध नहीं कर सकते हैं। आप 'प्रश्न वस्तु' नहीं भेज सकते हैं, प्रति से; आप केवल ऑब्जेक्ट के गुणों का JSON dict भेज सकते हैं। Django में एक [अंतर्निहित धारावाहिक सहायक] है (https://docs.djangoproject.com/en/dev/topics/serialization/#serializing-data) जो क्वेरीसेट को संभाल सकता है। – AdamKG

3

उपयोग JsonResponse

from django.http import JsonResponse 
response_data = {put your data into a dict} 
return JsonResponse(response_data, status=201) 
संबंधित मुद्दे