Python | Form validation using django (original) (raw)

Last Updated : 23 Jan, 2023

Prerequisites: Django Installation | Introduction to Django
Django works on an MVT pattern. So there is a need to create data models (or tables). For every table, a model class is created.
Suppose there is a form that takes Username, gender, and text as input from the user, the task is to validate the data and save it.
In django this can be done, as follows:

Python

from django.db import models

class Post(models.Model):

`` Male = 'M'

`` FeMale = 'F'

`` GENDER_CHOICES = (

`` (Male, 'Male' ),

`` (FeMale, 'Female' ),

`` )

`` username = models.CharField( max_length = 20 , blank = False ,

`` null = False )

`` text = models.TextField(blank = False , null = False )

`` gender = models.CharField(max_length = 6 , choices = GENDER_CHOICES,

`` default = Male)

`` time = models.DateTimeField(auto_now_add = True )

After creating the data models, the changes need to be reflected in the database to do this run the following command:

python manage.py makemigrations

Doing this compiles the models and if it didn’t find any errors then, it creates a file in the migration folder. Later run the command given below to finally reflect the changes saved onto the migration file onto the database.

python manage.py migrate

Now a form can be created. Suppose that the username length should not be less than 5 and post length should be greater than 10. Then we define the Class PostForm with the required validation rules as follows:

Python

from django.forms import ModelForm

from django import forms

from formValidationApp.models import *

class PostForm(ModelForm):

`` class Meta:

`` model = Post

`` fields = [ "username" , "gender" , "text" ]

`` def clean( self ):

`` super (PostForm, self ).clean()

`` username = self .cleaned_data.get( 'username' )

`` text = self .cleaned_data.get( 'text' )

`` if len (username) < 5 :

`` self ._errors[ 'username' ] = self .error_class([

`` 'Minimum 5 characters required' ])

`` if len (text) < 10 :

`` self ._errors[ 'text' ] = self .error_class([

`` 'Post Should Contain a minimum of 10 characters' ])

`` return self .cleaned_data

Till now, the data models and the Form class are defined. Now the focus will be on how these modules, defined above, are actually used.
First, run on localhost through this command

python manage.py runserver

Open http://localhost:8000/ in the browser, then it’s going to search in the urls.py file, looking for ‘ ‘ path
urls.py file is as given below:

Python

from django.contrib import admin

from django.urls import path, include

from django.conf.urls import url

from django.shortcuts import HttpResponse

from . import views

urlpatterns = [

`` path(' ', views.home, name =' index'),

]

Basically, this associates the ‘ ‘ url with a function home which is defined in views.py file.
views.py file:

Python

from .models import Post

from .forms import PostForm

from . import views

from django.shortcuts import HttpResponse, render, redirect

def home(request):

`` if request.method = = 'POST' :

`` details = PostForm(request.POST)

`` if details.is_valid():

`` post = details.save(commit = False )

`` post.save()

`` return HttpResponse( "data submitted successfully" )

`` else :

`` return render(request, "home.html" , { 'form' :details})

`` else :

`` form = PostForm( None )

`` return render(request, 'home.html' , { 'form' :form})

home.html template file

html

{% load bootstrap3 %}

{% bootstrap_messages %}

<!DOCTYPE html>

< html lang = "en" >

< head >

`` < title >Basic Form</ title >

`` < meta charset = "utf-8" />

`` < meta name = "viewport" content = "width=device-width, initial-scale=1, shrink-to-fit=no" >

</ script >

</ script >

</ head >

< body style = "padding-top: 60px;background-color: #f5f7f8 !important;" >

`` < div class = "container" >

`` < div class = "row" >

`` < div class = "col-md-4 col-md-offset-4" >

`` < h2 >Form</ h2 >

`` < form action = "" method = "post" >< input type = 'hidden' />

`` {%csrf_token %}

`` {% bootstrap_form form %}

<!-This is the form variable which we are passing from the function

of home in views.py file. That's the beauty of Django we

don't need to write much codes in this it'll automatically pass

all the form details in here

->

`` < div class = "form-group" >

`` < button type = "submit" class = "btn btn-default " >

`` Submit

`` </ button >

`` </ div >

`` </ form >

`` </ div >

`` </ div >

</ div >

</ body >

</ html >

Opening http://localhost:8000/ in the browser shows the following,

If a form with a username of length less than 5 is submitted, it gives an error at the time of submission and similarly for the Post Text filled as well. The following image shows how the form behaves on submitting invalid form data.