Удобная обработка форм

В одной из предыдущих статей я писал о том, как лекго встроить ajax-валидацию форм [web-brains.com] в уже существующие виды с формами. Сегодня я придумал, как сделать это ещё проще.

Напомню код, к которому я пришёл, в заметке про 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):
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}


@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


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)

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)

class SiteMiddleware(object):
def process_exception(self, request, exception):
if isinstance(exception, AjaxException):
return JsonResponse(exception.data)
Add post to:   Delicious Reddit Slashdot Digg Technorati Google
Make comment

Comments

No comments for this post

Required. 30 chars of fewer.

Required.

captcha image Please, enter symbols, which you see on the image