How To Execute CRUD Using Django Ajax and JSON

Ajax is a way of making web development more dynamic. Using Ajax we can load data from the server without reloading the web pages. AJAX stands for Asynchronous Javascript and XML.

In this tutorial, you’ll learn how to do CRUD operations using Django, Ajax Form Submission and JSON. We will be using the Class Based Views Functions. CRUD operation is the most basic operation that we perform on databases. CRUD stands for Create, Read, Update, Delete. We’ll take an example of a User Management System where we will add, update and delete users and its detail. The source code which we are building is also available on Github.

This Video Will Help You to Better Understand the Tutorial

Basic Configuration

In this tutorial we are going to use JQuery for implementing Ajax requests. JQuery is Simple and Easy to learn.

base.html

{% load static %}
<!doctype html>
<html>
 <head>
   <meta charset="utf-8">
   <title>{% block title %}Title{% endblock title %}</title>
   <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" integrity="sha384-BVYiiSIFeK1dGmJRAkycuHAHRg32OmUcww7on3RYdg4Va+PmSTsz/K68vbdEjh4u" crossorigin="anonymous">
   {% block stylesheet %}{% endblock stylesheet %}
 </head>
 <body>
   <main>
   {% block content %}
   {% endblock content %}
   </main>
   <script src="https://code.jquery.com/jquery-3.1.0.min.js"></script>
   <script src='https://code.jquery.com/jquery-3.2.1.min.js'></script>
   <script src='https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js'></script>
   {% block javascript %}
   {% endblock javascript%}
 </body>
</html>

I am also using Bootstrap for a beautiful user interface. For JQuery and Bootstrap, we are using CDN’s.

Example – Django Ajax CRUD Operations

I will be taking a simple example of User Detail Add Application. I will be working in an app called crud_ajax. For CRUD operation we will be using CrudUser Model.

# models.py

from django.db import models

class CrudUser(models.Model):
    name = models.CharField(max_length=30, blank=True)
    address = models.CharField(max_length=100, blank=True)
    age = models.IntegerField(blank=True, null=True)

Listing User Details Operation

Let’s get started by initially loading all user details. For that, we are going to use ListView.

# Views.py

from django.views.generic import ListView
from .models import CrudUser

class CrudView(ListView):
    model = CrudUser
    template_name = 'crud_ajax/crud.html'
    context_object_name = 'users'
# urls.py

from django.urls import path
from crud_ajax import  views 

urlpatterns = [
    path('crud/',  views.CrudView.as_view(), name='crud_ajax'),
]

Crud.html

{% extends 'base.html' %}
{% load static %}

{% block title %}Django Ajax CRUD{% endblock %}

{% block content %}
<div class="container">
   <h1>Django Ajax CRUD</h1>
   <div class="row">
     <div class="col-md-4 ">
       <h3>ADD USER</h3>
       <form id="addUser" action="">
         <div class="form-group">
           <input class="form-control" type="text" name="name" placeholder="Name" required>
         </div>
         <div class="form-group">
           <input class="form-control" type="text" name="address" placeholder="Address" required>
         </div>
         <div class="form-group">
           <input class="form-control" type="number" name="age" min="10" max="100" placeholder="Age" required>
         </div>
         <button class="btn btn-primary form-control" type="submit">SUBMIT</button>
       </form>
     </div>
     <div class="col-md-8">
       <h3>USERS</h3>
       <table id="userTable" class="table table-striped">
         <tr>
           <th>Name</th>
           <th>Address</th>
           <th colspan="3">Age</th>
         </tr>
         {% if users %}
         {% for user in users %}
         <tr id="user-{{user.id}}">
             <td class="userName userData" name="name">{{user.name}}</td>
             <td class="userAddress userData" name="address">{{user.address}}</td>
             <td class="userAge userData" name="age">{{user.age}}</td>
             <td align="center">
                 <button class="btn btn-success form-control" onClick="editUser({{user.id}})" data-toggle="modal" data-target="#myModal")">EDIT</button>
             </td>
             <td align="center">
                 <button class="btn btn-danger form-control" onClick="deleteUser({{user.id}})">DELETE</button>
             </td>
         </tr>
         {% endfor %}
         {% else %}
           No Users
         {% endif %}
       </table>
     </div>
   </div>
 </div>
 <!-- Modal -->
 <div class="modal fade" id="myModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel">
   <div class="modal-dialog" role="document">
     <div class="modal-content">
       <div class="modal-header">
         <button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">×</span></button>
         <h4 class="modal-title" id="myModalLabel">Update User</h4>
       </div>
       <form id="updateUser" action="">
       <div class="modal-body">
           <input class="form-control" id="form-id" type="hidden" name="formId"/>
           <label for="name">Name</label>
           <input class="form-control" id="form-name" type="text" name="formName"/>
           <label for="address">Address</label>
           <input class="form-control" id="form-address" type="text" name="formAddress"/>
           <label for="age">Age</label>
           <input class="form-control" id="form-age" type="number" name="formAge" min=10 max=100/>
       </div>
       <div class="modal-footer">
           <button type="submit" class="btn btn-primary" >Save changes</button>
           <button type="button" class="btn btn-default" data-dismiss="modal">Close</button>
       </div>
       </form>
     </div>
   </div>
 </div>
{% endblock %}
{% block javascript %}
{% endblock javascript %}

In our HTML code, you will find the Add User form and modal for update user details, we will be going to use it later. So far our template should look like this:

Django Ajax CRUD Operations

Now it’s time to go with Ajax Calls.

Create and Read User Django Ajax

We will not be using any forms.py instead, we have hardcoded HTML form directly in the template. As you can see in our crud.html file.

If you want Django to make your form then you can use crispy forms.

Let’s create a view to handle the Ajax request.

# Views.py

from .models import CrudUser
from django.views.generic import View
from django.http import JsonResponse

class CreateCrudUser(View):
    def  get(self, request):
        name1 = request.GET.get('name', None)
        address1 = request.GET.get('address', None)
        age1 = request.GET.get('age', None)

        obj = CrudUser.objects.create(
            name = name1,
            address = address1,
            age = age1
        )

        user = {'id':obj.id,'name':obj.name,'address':obj.address,'age':obj.age}

        data = {
            'user': user
        }
        return JsonResponse(data)

Note– We are not rendering the template, we are just returning JsonResponse and we are also using Ajax Get Method.

We are getting the form data using request.GET.get(address, None), address is the form’s input name attribute. Then we are creating a user and sending back the user which we have created so to display it on the web page.

# urls.py
from django.urls import path
from crud_ajax import views 

urlpatterns = [
    path('crud/',  views.CrudView.as_view(), name='crud_ajax'),
    path('ajax/crud/create/',  views.CreateCrudUser.as_view(), name='crud_ajax_create'),
]

Form in Crud.html for adding Users.

<form id="addUser" action="">
         <div class="form-group">
           <input class="form-control" type="text" name="name" placeholder="Name" required>
         </div>
         <div class="form-group">
           <input class="form-control" type="text" name="address" placeholder="Address" required>
         </div>
         <div class="form-group">
           <input class="form-control" type="number" name="age" min="10" max="100" placeholder="Age" required>
         </div>
         <button class="btn btn-primary form-control" type="submit">SUBMIT</button>
</form>

Now let again add javascript and jquery ajax request in Crud.html which we have created while listing the users

Crud.html

...

{% block javascript %}
<script>
// Create Django Ajax Call
$("form#addUser").submit(function() {
    var nameInput = $('input[name="name"]').val().trim();
    var addressInput = $('input[name="address"]').val().trim();
    var ageInput = $('input[name="age"]').val().trim();
    if (nameInput && addressInput && ageInput) {
        // Create Ajax Call
        $.ajax({
            url: '{% url "crud_ajax_create" %}',
            data: {
                'name': nameInput,
                'address': addressInput,
                'age': ageInput
            },
            dataType: 'json',
            success: function (data) {
                if (data.user) {
                  appendToUsrTable(data.user);
                }
            }
        });
      } else {
        alert("All fields must have a valid value.");
    }
    $('form#addUser').trigger("reset");
    return false;
});
function appendToUsrTable(user) {
  $("#userTable > tbody:last-child").append(`
        <tr id="user-${user.id}">
            <td class="userName" name="name">${user.name}</td>
            '<td class="userAddress" name="address">${user.address}</td>
            '<td class="userAge" name="age">${user.age}</td>
            '<td align="center">
                <button class="btn btn-success form-control" onClick="editUser(${user.id})" data-toggle="modal" data-target="#myModal")">EDIT</button>
            </td>
            <td align="center">
                <button class="btn btn-danger form-control" onClick="deleteUser(${user.id})">DELETE</button>
            </td>
        </tr>
    `);
}
</script>
{% endblock javascript %}

The working of the above JQuery is like that when you submit the form id=’addUser’, It will take the values of the input fields and ajax call will be gone to the server.

$.ajax({
            url: '{% url "crud_ajax_create" %}',
            data: {
                'name': nameInput,
                'address': addressInput,
                'age': ageInput
            },
            dataType: 'json',
            success: function (data) {
                if (data.user) {
                  appendToUsrTable(data.user);
                }
            }
});

Let us understand what the above ajax request commanding to the browser.

URL – where resource is located:

url: '/ajax/crud/create/',

Data Type – Type of Data we want in return:

dataType: 'json',

Return Data – Dictionary of data what we want to send:

data: {
                'name': nameInput,
                'address': addressInput,
                'age': ageInput
      },

Success Response – Once we receive response from ajax, execute the code:

success: function (data) {
                if (data.user) {
                  appendToUsrTable(data.user);
                }
            }

When the user fills the form and submits it. Submitted data goes to the server and after validation into the database and the function appendToUsrTable is called. This appendToUsrTable function is just a jQuery where it appends the user which we have added using User Add Form. When a user is added it will look like this:

Create User Using Django Ajax Jquery

Update User Django Ajax

# Views.py

class UpdateCrudUser(View):
    def  get(self, request):
        id1 = request.GET.get('id', None)
        name1 = request.GET.get('name', None)
        address1 = request.GET.get('address', None)
        age1 = request.GET.get('age', None)

        obj = CrudUser.objects.get(id=id1)
        obj.name = name1
        obj.address = address1
        obj.age = age1
        obj.save()

        user = {'id':obj.id,'name':obj.name,'address':obj.address,'age':obj.age}

        data = {
            'user': user
        }
        return JsonResponse(data)
# urls.py

from django.urls import path
from crud_ajaximport  views  

urlpatterns = [
    path('crud/',  views.CrudView.as_view(), name='crud_ajax'),
    path('ajax/crud/create/',  views.CreateCrudUser.as_view(), name='crud_ajax_create'),
    path('ajax/crud/update/',  views.UpdateCrudUser.as_view(), name='crud_ajax_update'),
]

crud.html

...
// Create Django Ajax Call
$("form#updateUser").submit(function() {
   var idInput = $('input[name="formId"]').val().trim();
   var nameInput = $('input[name="formName"]').val().trim();
   var addressInput = $('input[name="formAddress"]').val().trim();
   var ageInput = $('input[name="formAge"]').val().trim();
   if (nameInput && addressInput && ageInput) {
       // Create Ajax Call
       $.ajax({
           url: '{% url "crud_ajax_update" %}',
           data: {
               'id': idInput,
               'name': nameInput,
               'address': addressInput,
               'age': ageInput
           },
           dataType: 'json',
           success: function (data) {
               if (data.user) {
                 updateToUserTabel(data.user);
               }
           }
       });
  } else {
       alert("All fields must have a valid value.");
   }
   $('form#updateUser').trigger("reset");
   $('#myModal').modal('hide');
   return false;
});

// Update Django Ajax Call
function editUser(id) {
 if (id) {
   tr_id = "#user-" + id;
   name = $(tr_id).find(".userName").text();
   address = $(tr_id).find(".userAddress").text();
   age = $(tr_id).find(".userAge").text();
   $('#form-id').val(id);
   $('#form-name').val(name);
   $('#form-address').val(address);
   $('#form-age').val(age);
 }
}
function updateToUserTabel(user){
   $("#userTable #user-" + user.id).children(".userData").each(function() {
       var attr = $(this).attr("name");
       if (attr == "name") {
         $(this).text(user.name);
       } else if (attr == "address") {
         $(this).text(user.address);
       } else {
         $(this).text(user.age);
       }
     });
}

Update user is similar to Create User. In views.py instead of create query, we are using an update query.

In Ajax Request call we are sending one more parameter id to identify the row in the database.

We are also using two jQuery function – editUser and updateToUserTabel

editUser – is used for updating the form id=”updateUser” which is inside the modal. And updateToUserTabel is used in the success of Ajax request for updating the user detail which we have updated.

Update User Ajax Django Jquery JSON

Delete User Django Ajax

# Views.py

class DeleteCrudUser(View):
    def  get(self, request):
        id1 = request.GET.get('id', None)
        CrudUser.objects.get(id=id1).delete()
        data = {
            'deleted': True
        }
        return JsonResponse(data)
# urls.py

from django.urls import path
from crud_ajax import views 

urlpatterns = [
    path('crud/',  views.CrudView.as_view(), name='crud_ajax'),
    path('ajax/crud/create/',  views.CreateCrudUser.as_view(), name='crud_ajax_create'),
    path('ajax/crud/update/',  views.UpdateCrudUser.as_view(), name='crud_ajax_update'),
    path('ajax/crud/delete/',  views.DeleteCrudUser.as_view(), name='crud_ajax_delete'),
]

Crud.html

// Delete Django Ajax Call
function deleteUser(id) {
 var action = confirm("Are you sure you want to delete this user?");
 if (action != false) {
   $.ajax({
       url: '{% url "crud_ajax_delete" %}',
       data: {
           'id': id,
       },
       dataType: 'json',
       success: function (data) {
           if (data.deleted) {
             $("#userTable #user-" + id).remove();
           }
       }
   });
 }
}

Deleting User using Ajax Django is one of the easiest ways. In ajax request, we are sending an id of the object which we want to delete to view. In View, delete query is executed and deleted flag is sent in Response. In success, we directly write the jQuery function to remove the section which we want to remove from the table using id dynamically.

Delete User Django Ajax JSON JQuery

Conclusion

We are using Class-based views, which are simple and recommendable. We have used Jquery Ajax and JSON and Python. For CSS and styling, we have used Bootstrap.

The code is available on GitHub – https://github.com/studygyaan/How-To-Execute-CRUD-Using-Django-Ajax-and-JSON

Share