2012-08-03 12 views
22

मेरे पास कई दृश्यों के साथ एक django एप्लिकेशन है जो POST अनुरोधों के माध्यम से जेसन ऑब्जेक्ट स्वीकार करता है। json वस्तुओं मध्यम जटिल घोंसले के कुछ परतों के साथ कर रहे हैं, इसलिए मैं जैसा कि यहाँ दिखाया, raw_post_data पार्स करने के लिए json पुस्तकालय का उपयोग कर रहा:django: जेसन ऑब्जेक्ट्स के साथ पोस्ट-आधारित विचारों का परीक्षण

def handle_ajax_call(request): 
    post_json = json.loads(request.raw_post_data) 

    ... (do stuff with json query) 

इसके बाद, मैं उन दृश्यों का परीक्षण लिखना चाहते हैं। दुर्भाग्य से, मैं यह नहीं समझ सकता कि क्लाइंट को जेसन ऑब्जेक्ट को कैसे पास किया जाए।

AttributeError: 'str' object has no attribute 'items' 

मैं कैसे Client.post विधि में JSON ऑब्जेक्ट पारित कर सकते हैं:

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) 

जब मैं परीक्षण चलाने के लिए, इसके साथ विफल रहता है: यहाँ मेरी कोड का एक सरल-केस संस्करण है?

उत्तर

45

The documentation सूचित करते हैं कि अगर आप client.post करने के लिए एक content_type पैरामीटर पारित, यह एक दस्तावेज के रूप में data मूल्य का इलाज और इसे सीधे पोस्ट करेंगे लगता है। तो इसे आजमाएं:

response = c.post('/ajax/call/', content_type='application/json', data=J_string) 
+1

बहुत बढ़िया! प्रलेखन में ठीक प्रिंट को डीकोड करने के लिए धन्यवाद। यह विशेष रूप से जेसन का उल्लेख नहीं करता है, इसलिए यह मेरी किसी भी खोज में नहीं बढ़ रहा था। – Abe

+0

ध्यान दें कि इस विशेष उपयोग के मामले के लिए, request.is_ajax() शायद काम नहीं करता है। तो अगर आप अनुरोध में 'एप्लिकेशन/जेसन' जैसे कुछ का उपयोग कर रहे हैं। एमएमटीए ['CONTENT_TYPE'] यह पता लगाने के लिए कि कॉल अजाक्स है या नहीं, डैनियल के समाधान में सामग्री प्रकार हेडर को सही तरीके से सेट करने का अतिरिक्त लाभ है। –

+1

यह सामग्री जानकारी जोड़ने के दौरान मुझे प्राप्त होने वाली पोस्ट जानकारी है: '', इसलिए सभी डेटा कुंजी बन जाता है , यह सही नहीं लगता है। – Hassek

संबंधित मुद्दे