Bytes

CRUD Operations in Django

Last Updated: 13th October, 2023

In Django, implementing CRUD operations is straightforward thanks to the built-in ORM and the framework's philosophy of "batteries included." Django's ORM provides a high-level abstraction of the database, allowing developers to interact with the database using Python classes and objects, rather than writing raw SQL queries. This makes it easier to write and maintain code, as well as reducing the likelihood of SQL injection attacks.

In this topic, we will explore how to implement CRUD operations in Django. We will start by discussing the basics of Django's ORM and how to define models, which are Python classes that represent database tables. Then, we will delve into each of the CRUD operations and show how to implement them using Django's built-in functionality. We will also cover common scenarios such as handling forms, handling errors, and implementing search functionality. By the end of this topic, you will have a solid understanding of how to implement CRUD operations in Django and be able to use this knowledge to build your own web applications.

Setting up the Project

In the previous lessons, we learned to create a new Django project and also set up a new app within the project. Now, let's see how to create the necessary Django models for CRUD operations.

In Django, models are Python classes that represent database tables. To create a model, open the **models.py** file within your app directory and define your model using the Django ORM.

For example, if you want to create a model for a blog post, you can define it as follows:

Loading...

In this example, we define a **Post** model with four fields: **title**, **content**, **created_at**, and **updated_at**. The **__str__** method is used to specify how the model should be represented as a string.

Once you have defined your models, you can run the following command in the terminal window to create the corresponding database tables:

Loading...

The first command generates the necessary SQL code to create the tables, while the second command applies the migrations to the database.

That's a brief overview of how to create a new Django project, set up a new app within the project, and create the necessary Django models for CRUD operations. From here, you can start implementing the CRUD functionality by defining views, templates, and forms as needed.

Creating Records

Let’s see how to create a form to allow users to create new records, handle form submission and validation, and save the new record to the database.

  • Creating a form to allow users to create new records:

In Django, you can create a form using a Python class that inherits from **django.forms.Form** or **django.forms.ModelForm**. The **Form** class is used for creating custom forms that are not tied to a model, while the **ModelForm** class is used for creating forms that are based on a model.

For example, to create a form for creating a new blog post, you can define it as follows:

Loading...

In this example, we create a **PostForm** class that inherits from **ModelForm** and is based on the **Post** model. We specify the fields that should be included in the form using the **fields** attribute.

  • Handling form submission and validation:

In Django, form submission is typically handled by a view function that processes the form data and returns a response. To handle form submission and validation, you can define a view function that uses the **PostForm** to validate the form data and create a new **Post** object.

For example, to handle form submission for the **PostForm**, you can define a view function as follows:

Loading...

In this example, we define a **create_post** view function that checks if the request method is **POST**. If it is, we create a new **PostForm** object with the form data and check if the form is valid using the **is_valid()** method. If the form is valid, we save the new **Post** object using the **save()** method and redirect the user to the **post_detail** view.

If the request method is not **POST**, we create a new **PostForm** object and render the **create_post.html** template with the form object.

  • Saving the new record to the database:

To save the new **Post** object to the database, we use the save() method of the **PostForm**. This method creates a new **Post`** object with the form data and saves it to the database.

In the **create_post** view function we defined earlier, we call the **save()** method on the **PostForm** object to save the new **Post** object to the database. This method takes care of creating a new **Post** object with the form data and saving it to the database. Once the new **Post** object is saved to the database, we can redirect the user to the **post_detail** view, which displays the details of the new post. Alternatively, we can redirect the user to the list of all posts, the post creation page, or any other relevant page.

In summary, creating a form to allow users to create new records in Django involves defining a form class based on the model, handling form submission and validation in a view function, and saving the new record to the database using the **save()** method of the form object. With these steps, you can enable users to create new records in your Django application with ease.

Reading Records

Let’s see how to display records in a list or table, allow users to view individual records, and add pagination to handle large data sets in Django.

  • Displaying records in a list or table:

To display records in a list or table in Django, you can define a view function that retrieves the records from the database and passes them to a template for rendering.

For example, to display a list of all blog posts in a template, you can define a view function as follows:

Loading...

In this example, we define a **post_list** view function that retrieves all **Post** objects from the database using the **all()** method and passes them to the **post_list.html** template using the **render()** function.

In the **post_list.html** template, you can use a loop to iterate over the **posts** queryset and display each post in a list or table. For example:

Loading...

This code will display a list of all blog posts in the **posts** queryset.

  • Allowing users to view individual records:

To allow users to view individual records, you can define a view function that retrieves a single record from the database and passes it to a template for rendering.

For example, to allow users to view a single blog post in a template, you can define a view function as follows:

Loading...

In this example, we define a **post_detail** view function that retrieves a single **Post** object from the database using the **get_object_or_404()** function, which returns a 404 error page if the object does not exist. We pass the **Post** object to the **post_detail.html** template using the **render()** function.

In the **post_detail.html** template, you can use the attributes of the **post** object to display the details of the post. For example:

Loading...

This code will display the details of the **post** object.

  • Adding pagination to handle large data sets:

When dealing with large data sets, it's important to add pagination to your views to improve performance and user experience. In Django, you can use the built-in **Paginator** class to add pagination to your views.

For example, to add pagination to the **post_list** view function we defined earlier, you can modify it as follows:

Loading...

In this example, we use the **Paginator** class to create a paginator object with the **post_list** queryset and a page size of 10. We get the current page number from the **request.GET** a dictionary using the **get()** method, and then use the **get_page()** method of the paginator object to retrieve the corresponding page of objects.

In the **post_list.html** template, you can use the **posts** object to display the paginated list of posts. For example:

Loading...

This code will display a paginated list of blog posts with navigation links to the previous and next pages.

In summary, displaying records in a list or table, allowing users to view individual records, and adding pagination to handle large data sets in Django involve defining view functions that retrieve data from the database and pass it to templates for rendering, and using Django's built-in tools such as the **get_object_or_404()** function and **Paginator** class to handle data retrieval and pagination. With these steps, you can create a robust and user-friendly interface for managing data in your Django application.

Updating Records

In order to allow users to update existing records in a Django application, you will need to create a form that pre-fills the fields with the existing data, allow users to make changes, and submit the updated data to the server for processing. Here are the steps to implement this functionality:

  • Define a URL route for the update form view: In your **urls.py** file, define a URL pattern that will map to a view function that will display the update form. For example:
Loading...
  • Define the update form view function: In your **views.py** file, define a function that will handle the form submission and update the record in the database. This function will be similar to the create view function, but it will pre-populate the form fields with the existing data for the record being updated. For example:
Loading...
  • Define the update form: In your **forms.py** file, define a form that will be used to update the record in the database. This form will be similar to the create form, but it will pre-populate the fields with the existing data for the record being updated. For example:
Loading...
  • Define the update form template: In your **post_edit.html** template, create a form that will be used to update the record. This form will be similar to the create form, but it will pre-populate the fields with the existing data for the record being updated. For example:
Loading...
  • Update the record in the database: When the user submits the update form, the data will be validated and processed by the view function, which will update the record in the database using the **save()** method of the form's instance. For example:
Loading...

In summary, creating a form to allow users to update existing records in a Django application involves defining a URL route, view function, form, and template that pre-populates the form fields with the existing data, allows users to make changes, and submits the updated data to the server for processing. With these steps, you can create a user-friendly interface for managing data in your Django application.

Deleting Records

To add a delete button to individual records in a Django application, you will need to create a new view and URL route to handle the deletion request. Here are the steps to implement this functionality:

  • Define a URL route for the delete view: In your **urls.py** file, define a URL pattern that will map to a view function that will handle the delete request. For example:
Loading...
  • Define the delete view function: In your **views.py** file, define a function that will handle the delete request and render a confirmation template. This template will ask the user to confirm the deletion with a pop-up dialog. For example:
Loading...
  • Define the delete confirmation template: In your **post_delete.html** template, create a form that will be used to confirm the deletion. This form should include a submit button that will trigger the deletion request. For example:
Loading...
  • Define the delete view function: In your **views.py** file, define a function that will handle the deletion request and redirect the user to a new page. For example:
Loading...
  • Add the delete button to individual records: In your list or detail template, add a button or link that will trigger the delete view when clicked. For example:
Loading...

In summary, adding a delete button to individual records in a Django application involves defining a URL route, view function, confirmation template, and delete view function that will handle the deletion request and redirect the user to a new page. With these steps, you can create a user-friendly interface for managing data in your Django application.

Conclusion

In conclusion, implementing CRUD operations in Django is an essential part of developing web applications that interact with a database. By following the steps outlined in this discussion, you can create a robust, user-friendly application that allows users to create, read, update, and delete records with ease.

Django provides a range of built-in tools and features to support these operations, including the ability to define models, create forms, and use class-based views. With these tools, you can develop a flexible and scalable application that can handle a wide range of data and user inputs.

By adding functionality such as pagination, form validation, and confirmation dialogs, you can further enhance the usability of your application and provide users with a smooth and intuitive experience.

Module 5: Django Admin and CRUD OperationsCRUD Operations in Django

Top Tutorials

Related Articles

  • Official Address
  • 4th floor, 133/2, Janardhan Towers, Residency Road, Bengaluru, Karnataka, 560025
  • Communication Address
  • Follow Us
  • facebookinstagramlinkedintwitteryoutubetelegram

© 2024 AlmaBetter