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

В одной из предыдущих статей я писал о том, как лекго встроить 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:   Google Slashdot Yahoo Digg Technorati Delicious Bobrdobr.ru Newsland.ru Smi2.ru Rumarkz.ru Vaau.ru Memori.ru Rucity.com Moemesto.ru News2.ru Mister-Wong.ru Yandex.ru Myscoop.ru 100zakladok.ru
Make comment

Comments

No comments for this post
comment submission form

Required. 30 chars of fewer.

Required.

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