Ух, прошел год с тех пор, как я видел эту ветку. Что ж, с появлением Django 1.3 и волшебных недокументированных представлений на основе классов стало легче расширять функциональность, связанную с представлением Django. Мой проект, который интенсивно использует базовые представления CRUS, основанные на классах Django, нуждается в функциональности AJAX и JSON. Я добавил пример того, как я изменил представление обновлений Django для поддержки AJAX и возврата ответов AJAX в формате JSON. Посмотрите:
def errors_to_json(errors):
"""
Convert a Form error list to JSON::
"""
return dict(
(k, map(unicode, v))
for (k,v) in errors.iteritems()
)
class HybridUpdateView(UpdateView):
"""
Custom update generic view that speaks JSON
"""
def form_valid(self, form, *args, **kwargs):
"""
The Form is valid
"""
form.save()
self.message = _("Validation passed. Form Saved.")
self.data = None
self.success = True
payload = {'success': self.success, 'message': self.message, 'data':self.data}
if self.request.is_ajax():
return HttpResponse(json.dumps(payload),
content_type='application/json',
)
else:
return super(HybridUpdateView, self).form_valid(
form, *args, **kwargs
)
def form_invalid(self, form, *args, **kwargs):
"""
The Form is invalid
"""
#form.save()
self.message = _("Validation failed.")
self.data = errors_to_json(form.errors)
self.success = False
payload = {'success': self.success, 'message': self.message, 'data':self.data}
if self.request.is_ajax():
return HttpResponse(json.dumps(payload),
content_type='application/json',
)
else:
return super(HybridUpdateView, self).form_invalid(
form, *args, **kwargs
)
Ответ JSON содержит три поля - message
(которое читается человеком), data
(в этом случае будет список ошибок формы) и success
(либо true
, либо false
, указывая, был ли запрос успешным или нет соответственно.). Это очень легко сделать в клиентской части jQuery. Пример ответа выглядит так:
Content-Type: application/json
{"message": "Validation failed.", "data": {"host": ["This field is required."]}, "success": false}
Это всего лишь пример того, как я сериализовал ошибки формы в JSON и реализовал их в обобщенном представлении на основе классов, но его также можно использовать для работы с обычными представлениями стилей.