Даже если бы гипотеза о том, что цикл while быстрее, чем цикл for, была верной (а это не так), циклы, которые вам пришлось бы изменять / оптимизировать, были бы не внешними, а внутренними, потому что они выполняется больше раз.
Получил после множества возни, тестирования разных вещей. NB Я не уверен, работает ли это также с интернационализацией. Это также принимает первую ошибку проверки для каждого поля, но изменить ее, чтобы получить все ошибки, должно быть довольно легко.
return json_response({ 'success' : False,
'errors' : [(k, v[0].__unicode__()) for k, v in form.errors.items()] })
Проблема в том, что сообщение об ошибке представляет собой объект ленивого перевода. В документах упоминается следующее:
Просто убедитесь, что у вас есть sure_ascii = False, и используйте LazyEncoder.