programmerislam.wordpress.com

python programmer

django simple form validation shortcut 28 December 2011

Filed under: python — S.M.A.H. @ 16:34

hello readers,

today i will share my idea on django form validation. In a normal way @ something that you learn
from django docs maybe you will do like this

from django.shortcuts import render_to_response
from django import forms

class BiodataForm(forms.Form):
    firstname = forms.CharField(widget = forms.TextInput(), required = True)
    lastname = forms.CharField(widget = forms.TextInput(), required = True)
    dob = forms.DateField(required = True)

def biodataHandler(request):
    if request.method == 'POST':
        form = BiodataForm(request.POST)
        if form.is_valid():
            # do something, submit to db,etc..
        else:
            # display errors
    else:
        form = BiodataForm()
        # display back the form in template

that is a static way on form validation handling..you will repeat it on the other function,right?
remember the DRY(Don’t Repeat Yourself) principle..
my idea is i will create a shortcut function to dynamically handle any form validation,ok lets begin

let say i have a biodata model (note that i use separate model in models folder)
myproject/models/biodata.py

from django.db import models

class Biodata(models.Model):
    firstname = models.CharField(max_length = 32, null = False, blank = False)
    lastname = models.CharField(max_length = 32, null = False, blank = False)
    dob = models.DateField(null = False, blank = False)

and the shortcuts function
myproject/lib/shortcuts.py

def validateform(form, request):
    if request.method.lower() == 'post':
        f = form(request.POST)
        if not f.is_valid() and f.errors:
            return (f, f.errors)
        elif f.is_valid():
            return (f, None)
    else:
        f = form()
        return (f, None)

the controller (note that i put all controllers in controllers folder)
myproject/controllers/biodata.py

from django.shortcuts import render_to_response
from django.views.decorators.http import require_http_methods
from django import forms
from myproject.models.biodata import Biodata
from myproject.lib.shortcuts import validateform

class BiodataForm(forms.ModelForm):
    class Meta:
        model = Biodata

@require_http_methods(["GET", "POST"])
def biodataHandler(request):
    form, errors = validateform(BiodataForm, request)
    data = {}
    if errors:
        data.update({
            'errors': errors
        })
        # display errors
    elif not errors and form.data:
        # do something, submit to db,etc..
    data.update({'form': form})
    return render_to_response('biodata.html', data, mimetype='text/html')

that’s it..