إرجاع أخطاء نموذج Django النقي في JSON
-
13-09-2019 - |
سؤال
لدي شكل django الذي أطلعه في عرض DJango العادي. أحاول معرفة كيفية استخراج الأخطاء الخالصة (بدون تنسيق HTML). أدناه هو الرمز الذي أستخدمه في الوقت الحالي.
return json_response({ 'success' : False,
'errors' : form.errors })
مع هذا، أحصل على خطأ وكيل الوكيل المشهير من django. إجبار كل خطأ في Unicode لن يقوم بالحيلة أيضا، لأنه ثم كل من الأخطاء " __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')
المحلول 2
حصلت عليه بعد كثيرا من العبث حولها، واختبار أشياء مختلفة. ملحوظة لست متأكدا مما إذا كان هذا يعمل مع التدويل كذلك. يأخذ هذا أيضا أول خطأ في التحقق من الصحة لكل حقل، ولكن تعديله للحصول على كل الأخطاء يجب أن يكون سهلا إلى حد ما.
return json_response({ 'success' : False,
'errors' : [(k, v[0].__unicode__()) for k, v in form.errors.items()] })
نصائح أخرى
يبدو أن هذا قد تم تحسينه. الأعمال التالية في Django 1.3:
return json_response({
'success': False,
'errors': dict(form.errors.items()),
})
لا حاجة الى __unicode__
أو الترجمة كسول بعد الآن. هذا أيضا يعطي مجموعة كاملة من الأخطاء لكل مجال.
لاستخدام 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)
المشكلة هنا هي أن رسالة الخطأ كائن ترجمة كسول. ال مستندات أذكر هذا:
فقط تأكد من أنك تضمن
نستطيع فعل ذلك:
import simplejson as json
errors = json.dumps(form.errors)
return HttpResponse(errors, mimetype='application/json')
json.dumps
لا يمكن تسلسل وظيفة وكيل Django (مثل الترجمات الكسولة).
مثل موثقة يجب عليك إنشاء فئة تشفير جديدة:
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)
هذا كل شئ :)