سؤال

لدي شكل 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)

هذا كل شئ :)

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top