Удобная обработка форм
В одной из предыдущих статей я писал о том, как лекго встроить ajax-валидацию форм [web-brains.com] в уже существующие виды с формами. Сегодня я придумал, как сделать это ещё проще.
Напомню код, к которому я пришёл, в заметке про ajax-валидацию:
После нововведений, которые я опишу ниже, вы сможете писать код ещё короче, а именно следующим образом:
Вот как это работает: build_form создаёт экземпляр формы BarForm и передаёт ему переданные *args и **kwargs (в примере мы ни *args ни **kwargs не передаём). Весь фокус в том, что если build_form понимает, что запрос пришёл для AJAX-валидации, то он выбрасывает Exception с созданной формой, который, ловится в специальном middleware.
Ну и код напоследок )
А вот и middleware
Напомню код, к которому я пришёл, в заметке про ajax-валидацию:
@render_to('bar.html')
def registration(request):
if 'POST' == request.method:
form = BarForm(request.POST)
else:
form = BarForm()
if '_ajax' in request.POST:
return ajaxform(form)
if form.is_valid():
user = form.save()
return HttpResponseRedirect('/')
return {
'form':form}
После нововведений, которые я опишу ниже, вы сможете писать код ещё короче, а именно следующим образом:
@render_to('bar.html')
def registration(request):
form = build_form(BarForm, request)
if form.is_valid():
user = form.save()
return HttpResponseRedirect('/')
return {
'form':form}
Вот как это работает: build_form создаёт экземпляр формы BarForm и передаёт ему переданные *args и **kwargs (в примере мы ни *args ни **kwargs не передаём). Весь фокус в том, что если build_form понимает, что запрос пришёл для AJAX-валидации, то он выбрасывает Exception с созданной формой, который, ловится в специальном middleware.
Ну и код напоследок )
def build_form(Form, request, *args, **kwargs):
if 'POST' == request.method:
form = Form(request.POST, *args, **kwargs)
else:
form = Form(*args, **kwargs)
if '_ajax' in request.POST:
raise AjaxException({'errors': form.errors, 'valid': not form.errors})
return form
class AjaxException(Exception):
"""
Use it to push json data to response
"""
def __init__(self, data, *args, **kwargs):
self.data = data
Exception.__init__(self, *args, **kwargs)
А вот и middleware
class SiteMiddleware(object):
def process_exception(self, request, exception):
if isinstance(exception, AjaxException):
return JsonResponse(exception.data)




















Comments