JSON

2009-06-12 19 views
35

में शुद्ध Django फॉर्म त्रुटियों को लौटाना मेरे पास एक Django रूप है जिसे मैं एक सामान्य Django दृश्य में मान्य कर रहा हूं। मैं शुद्ध त्रुटियों को निकालने का तरीका जानने का प्रयास कर रहा हूं (HTML स्वरूपण के बिना)। नीचे मैं जिस कोड का उपयोग कर रहा हूं वह नीचे है।JSON

return json_response({ 'success' : False, 
         'errors' : form.errors }) 

इसके साथ, मुझे Django से कुख्यात प्रॉक्सी ऑब्जेक्ट त्रुटि मिलती है। यूनिकोड में प्रत्येक त्रुटि को मजबूर करना या तो चाल नहीं करेगा, क्योंकि तब प्रत्येक त्रुटि '__unicode__ विधि को प्रभावी रूप से HTML-izing कहा जाएगा।

कोई भी विचार?

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

उन दिलचस्पी के लिए, यह json_response की परिभाषा है:

def json_response(x): 
    import json 
    return HttpResponse(json.dumps(x, sort_keys=True, indent=2), 
         content_type='application/json; charset=UTF-8') 
+0

स्वीकृत उत्तर पुराना है। Https://stackoverflow.com/a/28256365/604511 – aitchnyu

उत्तर

24

चारों ओर खिलवाड़, अलग अलग बातें परीक्षण के बहुत के बाद समझ गया। N.B. मुझे यकीन नहीं है कि यह अंतर्राष्ट्रीयकरण के साथ भी काम करता है या नहीं। यह प्रत्येक फ़ील्ड के लिए पहली सत्यापन त्रुटि भी लेता है, लेकिन सभी त्रुटियों को प्राप्त करने के लिए इसे संशोधित करना आसान होना चाहिए।

return json_response({ 'success' : False, 
         'errors' : [(k, v[0].__unicode__()) for k, v in form.errors.items()] }) 
+5

देखें आप '__unicode __()' को कॉल करने के बजाय 'v.'' ​​(जो एक त्रुटिसूची है) पर 'form.error_class.as_text (v)' 'v' – tehfink

+3

त्रुटियों = dict ([(k, form.error_class.as_text (v)) के प्रत्येक आइटम के लिए v, v form.errors.items()] वापसी json_response ({" त्रुटियां ": त्रुटियां}) – digitalPBK

+2

मुझे एक बेहतर संरचना प्रदान करने के लिए निम्नलिखित पाया गया है, और 1 से अधिक त्रुटि वाले आइटमों को भी पूरा करता है: '{k: v के लिए v, v संदर्भ में ['signup_form']। Error.items()}' – DanH

4

यहां मुद्दा यह है कि त्रुटि संदेश हैं आलसी अनुवाद वस्तु है। docs इसका उल्लेख करें:

बस सुनिश्चित करें कि आपको sure_ascii = गलत है और LazyEncoder का उपयोग करें।

+0

यह जाने का रास्ता है। मैंने एक उत्तर जोड़ा जो इस दृष्टिकोण को कुछ विवरण देता है। – bjunix

30

ऐसा लगता है कि यह सुधार हुआ है। Django 1.3 में निम्नलिखित काम करता है:

return json_response({ 
    'success': False, 
    'errors': dict(form.errors.items()), 
}) 

__unicode__ या आलसी अनुवाद किसी भी अधिक के लिए कोई ज़रूरत नहीं। यह प्रत्येक फ़ील्ड के लिए त्रुटियों की पूर्ण सरणी भी देता है। (आलसी अनुवाद की तरह)

import simplejson as json 

errors = json.dumps(form.errors) 
return HttpResponse(errors, mimetype='application/json') 
+0

यह – digitalPBK

+0

@digitalPBK को विस्तृत करने के लिए काम नहीं कर रहा है? – SystemParadox

+1

मुझे एक ही त्रुटि मिली है जैसे form.errors का उपयोग करते समय, (कुछ आलसी वर्ग) ऑब्जेक्ट को क्रमबद्ध नहीं किया जा सकता है। – digitalPBK

1

हम ऐसा कर सकते हैं।

documented के रूप में आप एक नया एनकोडर वर्ग बनाना चाहिए:

import json 
from django.utils.functional import Promise 
from django.utils.encoding import force_text 
from django.core.serializers.json import DjangoJSONEncoder 

class LazyEncoder(DjangoJSONEncoder): 
    def default(self, obj): 
     if isinstance(obj, Promise): 
      return force_text(obj) 
     return super(LazyEncoder, self).default(obj) 

उपयोग इस तरह नई एनकोडर:

json.dumps(s, cls=LazyEncoder) 

सब :)

0

json.dumps Django के प्रॉक्सी समारोह को क्रमानुसार नहीं कर सकते हैं:

19

Django के लिए 1.7+ Form.errors.as_json() का उपयोग करें कि या इस तरह कुछ:

errors = {f: e.get_json_data() for f, e in form.errors.items()} 
return json_response(success=False, data=errors)