533 views
asked in Python by
Python Tutorial - Python Django CRUD Operation with PostgreSQL Database - StudentCRUD

1 Answer

answered by
Python Tutorial - Python Django CRUD Operation with PostgreSQL Database - StudentCRUD

--- download and install python ---

https://www.python.org/downloads/

and install the "python-3.12.2-amd64.exe" file

--- install django in cmd ---

pip install django

1. Create a Project

django-admin startproject student_project

2. Create an App

cd student_project
python manage.py startapp student_crud

3. Project Structure

code .

Now you can open terminal in VSCode. then run command:

python manage.py runserver

# Create files as below structure.

• student_project
|
+---• student_crud (app folder)
|   |
|   +--• migrations (includes files related to migrations)
|   |
|   +--• templates
|   |  |--• student_crud
|   |  |  |--base.html
|   |  |  |--student_form.html
|   |  |  |--student_list.html
|   |
|   |--models.py
|   |--forms.py
|   |--urls.py
|   |--views.py
|
+---• student_project (project folder)
|   |
|   |--settings.py
|   |--urls.py
4. Register your project in settings.py

student_project->settings.py

add inside the 

INSTALLED_APPS = [
........
........
'student_crud'
]

5. Database Setup

->Open pgAdmin for accessing the PostgreSQL Database.

->Create a database StudentCRUD in PostgreSQL,

and configure into the settings.py file of django project.

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql',
        'NAME': 'StudentCRUD',
        'USER': 'postgres',
        'PASSWORD': 'admin@123',
        'HOST': 'localhost',
    }
}

Then Run :

python manage.py migrate

Note : If you are getting error like below then:

Traceback (most recent call last):

  File "C:\Users\Administrator\AppData\Local\Programs\Python\Python312\Lib\site-packages\django\db\backends\postgresql\base.py", line 25, in <module>

    import psycopg as Database

ModuleNotFoundError: No module named 'psycopg'

...........................

....................

Run for Python3 users:

 pip install psycopg
 pip install psycopg2

Now you can run the upgrade pip:

python.exe -m pip install --upgrade pip

6. Create Models

goto student_crud -> models.py

from django.db import models

# Create your models here.
class Section(models.Model):
    title = models.CharField(max_length=50)
    
    def __str__(self):
        return self.title

class Student(models.Model):
    fullname = models.CharField(max_length=100)
    std_reg = models.CharField(max_length=3)
    mobile = models.CharField(max_length=15)
    section = models.ForeignKey(Section, on_delete=models.CASCADE)
7. now run migrations
python manage.py makemigrations student_crud

8. now run sqlmigrate

python manage.py sqlmigrate student_crud 0001

9. now run migrate

python manage.py migrate

10. create goto student_crud -> views.py

from django.shortcuts import render, redirect
from .forms import StudentForm
from .models import Student

# Create your views here.
def student_list(request):
    context = {'student_list':Student.objects.all()}
    return render(request,"student_crud/student_list.html",context)
def student_form(request,id=0):
    if request.method == "GET":
        if id==0:
            form = StudentForm()
        else:
            student = Student.objects.get(pk=id)
            form = StudentForm(instance=student)
        return render(request,"student_crud/student_form.html",{'form':form})
    else:
        if id == 0:
            form = StudentForm(request.POST)
        else :
            student = Student.objects.get(pk=id)
            form = StudentForm(request.POST,instance = student)
        if form.is_valid():
            form.save()
        return redirect('/student/list/')
def student_delete(request,id):
    student = Student.objects.get(pk=id)
    student.delete()
    return redirect('/student/list/')
11. add lines in student_project -> urls.py (inside the student_project)
from django.contrib import admin
from django.urls import path,include
urlpatterns = [
    path('admin/', admin.site.urls),
    path('student/', include("student_crud.urls")),
]

12. create student_crud -> urls.py file inside the student_crud folder

from django.urls import path,include
from . import views
urlpatterns = [
    path('', views.student_form),
    path('list/', views.student_list),
    path('',views.student_form,name='student_insert'), # get and post request for insert operation
    path('<int:id>/',views.student_form,name='student_update'), # get and post request for update operation
    path('list/',views.student_list,name='student_list'), # get request for retrieve and display records
    path('delete/<int:id>',views.student_delete,name='student_delete'), # get and post request for update operation
]


13. create templates folder inside the app folder (i.e student_crud)

templates -> student_crud

14. Create Files

base.html
student_list.html
student_form.html

15. in base.html

<!DOCTYPE html>
<html>
<head>
<title>Student Crud</title>
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/css/bootstrap.min.css" integrity="sha384-T3c6CoIi6uLrA9TneNEoa7RxnatzjcDSCmG1MXxSR1GAsXEV/Dwwykc2MPK8M2HN" crossorigin="anonymous">
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.5.1/css/all.min.css" integrity="sha512-DTOQO9RWCH3ppGqcWaEA1BIZOC6xxalwEsw9c2QQeAIftl+Vegovlnee1c9QX4TctnWMn13TZye+giMm8e2LwA==" crossorigin="anonymous" referrerpolicy="no-referrer" />
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/js/bootstrap.min.js" integrity="sha384-BBtl+eGJRgqQAUMxJ7pMwbEyER4l1g+O15P+16Ep7Q9Q+zqX6gSbd85u4mG4QzX+" crossorigin="anonymous"></script>
</head>
<body>
<div class="container">
    <div class="row">
        <div class="col-md-8 offset-2">
            {% block content %}
            {% endblock content %}
        </div>
    </div>
</div>
</body>
</html>

16. in student_list.html

{% extends 'student_crud/base.html' %}

{% block content %}
<div class="container">
    <div class="row">
        <div class="col-md-8 offset-2">
            <table class="table table-borderless">
                <thead class="border-bottom font-weight-bold">
                    <tr>
                        <td>Full Name</td>
                        <td>Mobile</td>
                        <td>Section</td>
                        <td>Action</td>
                    </tr>
                </thead>
                <tbody>
                    {% for student in student_list %}
                    <tr>    
                        <td>{{student.fullname}}</td>
                        <td>{{student.mobile}}</td>
                        <td>{{student.section}}</td>
                        <td>
                            <a href="{% url 'student_update' student.id %}" class="btn text-secondary px-0">
                                <i class="fas fa-edit"></i> Edit
                            </a>
                            <a href="{% url 'student_insert' %}" class="btn btn-outline-success">
                                <i class="fas fa-plus"></i> Add
                            </a>
                            <form action="{% url 'student_delete' student.id %}" method="post" class="d-inline" >
                                {% csrf_token %}
                                <button type="submit" class="btn">
                                    <i class="fas fa-trash-alt text-danger"></i>
                                </button>
                            </form>
                        </td>
                    </tr>
                    {% endfor %}
                </tbody>
            </table>
        </div>
    </div>
</div>
{% endblock content %}

17. in student_form.html

{% extends 'student_crud/base.html' %}
{% load crispy_forms_tags %}

{% block content %}
<form action="" method="post" autocomplete="off">
    {% csrf_token %}
    {{form.fullname|as_crispy_field}}
    {{form.mobile|as_crispy_field}}
    <div class="row">
        <div class="col-md-6">
            {{form.std_reg|as_crispy_field}}
        </div>
        <div class="col-md-6">
            {{form.section|as_crispy_field}}
        </div>
    </div>
    <div class="container">
        <div class="row">
            <div class="col-md-8">
                <button type="submit" class="btn btn-success btn-block btn-lg"><i class="fa-solid fa-database"></i> Submit</button>
            </div>
            <div class="col-md-3">
                <a href="{% url 'student_list' %}" class="btn btn-secondary btn-block btn-lg"><i class="fas fa-stream"></i> Back to List</a>
            </div>
        </div>
    </div>
</form>
{% endblock content %}

18. create new file inside student_crud (app folder)

forms.py

add the below lines in forms.py

from django import forms
from .models import Student

class StudentForm(forms.ModelForm):
    
    class Meta:
        model = Student
        fields = ('fullname','mobile','std_reg','section')
    labels = {
            'fullname':'Full Name',
            'std_reg':'Student Registration'
        }
    def __init__(self,*args, **kwargs):
        super(StudentForm,self).__init__(*args, **kwargs)
        self.fields['section'].empty_label = "Select"
        self.fields['std_reg'].required = False
        

19. for the best design of the form we can use crispy forms and crispy bootstrap.

pip install django-crispy-forms
pip install crispy-bootstrap4

20. Add crispy-forms in settings.py

student_project->settings.py

add inside the 

INSTALLED_APPS = [
........
........
'crispy_forms',
'crispy_bootstrap4'
]

And then at the bottom of the page of settings.py

CRISPY_ALLOWED_TEMPLATE_PACKS = "bootstrap4"
CRISPY_TEMPLATE_PACK = "bootstrap4"

21. student_list.html page.

{% extends 'student_crud/base.html' %}

{% block content %}
<div class="container">
    <div class="row">
        <div class="col-md-8 offset-2">
            <table class="table table-borderless">
                <thead class="border-bottom font-weight-bold">
                    <tr>
                        <td>Full Name</td>
                        <td>Mobile</td>
                        <td>Section</td>
                        <td>Action</td>
                    </tr>
                </thead>
                <tbody>
                    {% for student in student_list %}
                    <tr>    
                        <td>{{student.fullname}}</td>
                        <td>{{student.mobile}}</td>
                        <td>{{student.section}}</td>
                        <td>
                            <a href="{% url 'student_update' student.id %}" class="btn text-secondary px-0">
                                <i class="fas fa-edit"></i> Edit
                            </a>
                            <a href="{% url 'student_insert' %}" class="btn btn-outline-success">
                                <i class="fas fa-plus"></i> Add
                            </a>
                            <form action="{% url 'student_delete' student.id %}" method="post" class="d-inline" >
                                {% csrf_token %}
                                <button type="submit" class="btn">
                                    <i class="fas fa-trash-alt text-danger"></i>
                                </button>
                            </form>
                        </td>
                    </tr>
                    {% endfor %}
                </tbody>
            </table>
        </div>
    </div>
</div>
{% endblock content %}

22. Open Browser and run

http://127.0.0.1:8000/student/

and

http://127.0.0.1:8000/student/list/

Most popular tags

laravel postgresql laravel-10 replication ha postgresql mongodb laravel-11 mongodb database mongodb tutorial ubuntu 24.04 lts streaming-replication mysql database laravel postgresql backup laravel login register logout database mysql php laravel 11 - login with otp valid for 10 minutes. user and admin registration user and admin login multiauth technlogy asp.net asp.net c# mysql master slave replication centos linux laravel sql server schedule backup autobackup postgresql django python haproxy load balancer install self sign ssl laravel 11 gaurds zabbix 7 how to install graylog on ubuntu 24.04 lts | step-by-step asp.net core mvc .net mvc network upload c# ssl integration sql server on ubuntu 22.04 lts mssql server ms sql server sql server user access in postgres mysql password change cent os linux configure replica laravel 11 socialite login with google account google login kubernetes (k8s) install nginx load balancer install install and configure .net 8.0 in ubuntu 24.04 lts php in iis php with iis php tutorial chirags php tutorials chirags php tutorial chirags tutorial laravel 11 guards mongodb sharding metabase business analytics metabase postgresql 16 to postgresql 17 postgresql migration letsencrypt mongodb crud rocky linux laravel custom captcha laravel 11 captcha laravel captcha mongo dll php.ini debian 12 nginx apache nextcloud gitea in ubuntu git gitea npm error node js mysql ndb cluster mysql cluster ssl oracle login register logout in python debian windows shell batch file bat file time stamp date time shopping cart in laravel centos rhel swap memeory rhel 5.5
...