0% found this document useful (0 votes)
5 views42 pages

Django Configuration

This document provides a comprehensive guide on setting up and using Django, covering installation, creating projects and apps, handling URLs, templates, models, migrations, and CRUD operations. It includes step-by-step instructions for creating a simple web application, managing data with models, and utilizing Django's template engine for dynamic content. Additionally, it discusses creating a recipe project with forms for data input and backend integration.

Uploaded by

jayjoshi2784
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
5 views42 pages

Django Configuration

This document provides a comprehensive guide on setting up and using Django, covering installation, creating projects and apps, handling URLs, templates, models, migrations, and CRUD operations. It includes step-by-step instructions for creating a simple web application, managing data with models, and utilizing Django's template engine for dynamic content. Additionally, it discusses creating a recipe project with forms for data input and backend integration.

Uploaded by

jayjoshi2784
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
You are on page 1/ 42

WELCOME T0 THE DJANGO SERIES

1. Installation Django
 INSTALL THE VIRTUALENV IN SYSTEM:
 CMD  pip install virtualenv
 ACTIVATE THE DJANGO COMMAND ON VS CODE:
 djangoenv\Scripts\activate
 DEACTIVATE COMMAND:
 deactivate
 INSTALL DJANGO:
 pip install django
 CREATE FIRST PROJECT:
 django-admin startproject "Project name"
 AFTER INSTALLING CHANGE THE DIRECTORIES:
 cd vcs
 START OUR DEVLOPMENT SERVER BY RUNNING COMMOND:
 python manage.py runserver
 QUIT IN DJANGO SERVER:
 CTRL+C
2. First App in Django
 CREATE AN APP:
 python manage.py startapp "App Name"
 ADD THE APP NAME IN SETTINGS.PY/INSTALLED APPS:
 'App name',
3. URL Section using html file
 ADD THE FUNCTION IN views.py FILES:
 from django.http import HttpResponse

def home(request):

return HttpResponse("Hey I am a Jay Joshi")

 NOW CALL THE ABOVE FUNCTION IN OUR WEBSITE USING urls.py FILES:
 from home.views import *

urlpatterns = [

path('', home, name= 'home'),

 NOW WE CREATE A HTML FILE IN TEMPLATE FOLDER:


 HOME  TEMPLATE  home.html
 CREATE A BASIC FILE HTML FORMATION & CHANGE THE VIEW FUNCTION IN view .py FILES USING
RENDER FUNCTION:
 def home(request):
return render(request, 'home/index.html')

4. Complate Template Engine


 What is Template Engine?
 When u pin the dynamic data in ur html file using views.py django file.
 NOW CREATE A LIST IN view.py:
 peoples = [

{'name': 'Jay', 'Age': 20},

{'name': 'Umang', 'Age': 21},

{'name': 'Vicky', 'Age': 22},

{'name': 'Sandeep', 'Age': 25},

{'name': 'Vishal', 'Age': 28},

 NOW MOVE THE PEOPLES LIST IN OUR HTML FILE USING A CONTEXT KEYWORD:
 return render(request, 'home/index.html', context={'peoples': peoples}) (using this function we
can add the backend data in template file home.html)
 NOW RENDER THE DATA IN HTML TEMPLATE:
 {{peoples}}
 NOW ADD THE TABLE IN HTML FILE:
 <table>

<tr>

<th>Sr. no.</th>

<th>Name</th>

<th>age</th>

</tr>

<tr>

<td>Alfreds Futterkiste</td>

<td>Maria Anders</td>

<td>Germany</td>

</tr>

</table>
 NOW ADD THE FOR LOOP IN view.py FILES:
 for people in peoples:
print(people)
 RENDER THE view.py FOR LOOP IN HTML FILE:
 <table>
<tr>
<th>Sr. no.</th>
<th>Name</th>
<th>age</th>
</tr>
{% for people in peoples %}
<tr>
<td>{{forloop.counter}}</td>
<td>{{people.name}}</td>
<td>{{people.Age}}</td>
</tr>
{% endfor %}
</table>
 ADD ONE MORE TR TAG NAMED CAN VOTE & AFTER GIVE THEM CONDITON.
 NOW WE CAN CREATE A IF..ELIF..ELSE LOOP: USING ONE VEGETABLE LIST
IN HTML FILE:
 <td {% if people.Age < 18 %} style="background: red;" {% endif %}>
{% if people.Age >= 18 %}
👍
{% else %}
👎
{% endif %}
</td>
 NOW CREATE 2 MORE FILE & COPY PASTE CODE IN HTML FILE:
 CONTACT.HTML
 ABOUT.HTML
 NOW ADD THE VIEWS IN views.py FILE
 def contact_page(request):
return render(request, 'home/contact.html')

def about(request):
return render(request, 'home/about.html')
 NOW ALSO ADD IN A URL IN urls.py FILE:
 path('contact/', contact_page, name= 'contact'),
path('about/', about, name= 'about'),
 NOW CREATE A URL LINKS TO GO ON DIFFERENT PAGE IN HTML:
 Home.html
<a href="/contact/">Contact</a>|
<a href="/about">About</a>
 About.html
<a href="/">Home</a>|
<a href="/contact">Contact</a>
 Contact.html

<a href="/">Home</a> |
<a href="/about">About</a>

 NOW THE HTML BOILOR CODE IS REPEAT IN EVERY HTML FILE SO WE WILL REMOVE THE CODE &
INHERIT WITH OTHER FILE:
 CREATE A NEW FILE IN TEMPLATE FOLDER NAMED base.html:
 COPY & PASTE THE HTML CODE WHICH CAN REPEAT ONE & MORE TIME:
 <!DOCTYPE html>
<html lang="en">
<head>
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/css/bootstrap.min.css"
rel="stylesheet"
integrity="sha384-
T3c6CoIi6uLrA9TneNEoa7RxnatzjcDSCmG1MXxSR1GAsXEV/Dwwykc2MPK8M2HN"
crossorigin="anonymous">
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Django tutorial</title>
<style>
table,
th,
td {
border: 1px solid black;
}
</style>
</head>
<body>
{% block content %}

{% endblock %}
<script>
console.log("Hello World");
</script>
</body>
</html>
 WE WRITE THE CODE BETWEEN BODY TAG TO INHERIT OTHER FILES:
 {% block content %}

{% endblock %}
 NOW ADD THAT CODE IN HTML MAIN FILES LIKE(Index, Contact, About Files)
 <!-- inherit with base.html document -->
{% extends 'base.html' %}
{% block content %}

<!—html code -- >


{% endblock %}
 GIVE THE NAME ON PARTICULAR PAGES USING CONTEXT KEYWORD IN views.py.
 context = {'page': 'Contact'}
 CHANGE THE TITLE NAME IN base.html FILE:
 <title>{{page}}</title>
 YOU CAN LEARN ABOUT MORE TEMPLATE IN DEPTH IN THE GIVEN WEBSITE: [Link]
5. Models & Migration in Django
 MIGRATION FOLDER IN FILE IN MIMP FILE WE WILL DISCUSS IN DEPTH LATER.
 WHAT IS MODEL.PY?
 It’s a SQL schema (structure) How you manage & see the database in website.
 When u want to create database for any data, that can written in this file.
 LETS CREATE A SIMPLE DATABASE.
 class Student(models.Model):
name = models.CharField(max_length = 20)
age = models.IntegerField()
email = models.EmailField()
address = models.TimeField()
image = models.ImageField()
file = models.FileField()
 NOW RUN THE COMMAND TO MIGRATE DATA IN Django. (ITS COMPLOSURY TO MAKE
MIGRATION EVRY TIME WHEN U ENTER THE NEW DATA IN UR models.py FILE)
 Python manage.py makemigration
 YOU CAN LEARN ABOUT MORE MODELS IN DEPTH IN THE GIVEN WEBSITE: [Link]
 WHEN U MIGRATION ON UR APP AFTER THAT ONE FILE CAN CREATE IN UR APP FOLDER:
 0001_initial.py
 IN THIS FILE 2 THINGS ARE VERY IMPORTANT:
 2 FIELD ARE VERY IMP.
1) Dependencies: if particular migration file can dependency with another file so that can add in
tupple in paricular file.
2) Operations: its create a migrations models for follow the data.
 IF WE CHANGE THE DATA MODELS IN models.py FILE THEN, WE DO ONCE AGAIN
MAKEMIGRATIONS COMMAND IN DATABASE & ANOTHER FILE WILL CREATE IN FILE THAT CALLED
 0002_alter_student_address.py
 DOWNLOAD A SQLITE SERVER
 NOW RUN THE COMMAND TO SEE THE DATA IN SQLLITE SERVER
 python manage.py migrate
 MOST ASKING QUESTION IN INTERVIEW:
 If we delete a any migration file then our data will collapse on the spot & not working the
data.
 That mistake u can see in sqllite server in “db.sqlite3” file in ur project folder
 When u open this file u can see the all over the database & “django_migrations” file
 If we delete any file in this & intital file then django can store that entry in database so that
can understand the u can do something wrong.
6. Django Shell
 WHAT IS A DJANGO SHELL?
 It’s a kind of a bridge, which we can do more things in Django. Example., interact, database
interact. When u want to import data in models or any file.
 NOW GO ON A DJANGO SHELL USING THIS COMMAND IN CMD.
 python manage.py shell
 IN SHELL WE CAN IMPORT THE STUDENTS DATA.
 from home.models import *
 ADD STUDENTS LIST & GIVE A ONE VARIABLE NAME TO STUDENT.
 students = Student(name="jay", age= 20, email = "jj623196@gmail.com", address =
"Vatva,Ahmedabad") or student = Student.object.create(name = "umang" , age = 20 , email =
"jj623196@gmail.com" , address = "Ahmedabad" ,)
 NOW PRINT THE STUDENTS DATA, JUST WRITE THE VARIABLE NAME IS students.
 <Student: Student object (None)>
 NOW SAVE THE STUDENT DATA.
 student.save()
 IF U WANT TO GET THE ALL STUDENTS THEN WRITE THIS COMMAND.
 Student.objects.all() // Student.objects.all()[0].name
 NOW CREATE A FILE TO utils.py NAMED & IMPORT STUDENT FROM MODELS.
 CREATE A FUNCTION THAT CAN RUN IN DJANGO NOT ON LIVE SERVER OR PY CODE.
 from home.models import Student
import time

def run_this_function():
print("Function Started")
time.sleep(1)
print("Function Executed")
 IF U WANT TO RUN THIS FUNCTION IN DJANGO THEN USE THE SHELL.
 WRITE RETURN TO IMPORT CODE IN SHELL. [Link]
 IF U WANT TO CHECK THE DATA LIKE U WANT TO CHECK SOME DATA THAT CAN CHECK IN SHELL.
 YOU CAN LEARN ABOUT MORE MODELS IN DEPTH IN THE GIVEN WEBSITE: [Link]
7. CRUD Operations
 CRUD : Create, Read, Update, Delete
7.1 CREATE OPERATION
 LET’S CREATE A NEW MODELS IN MODELS.PY FILE.
 class Car(models.Model):
car_name = models.CharField(max_length = 100)
speed = models.IntegerField(default = 50)
 NOW CREATE A DATA FROM A CAR LIST.
 from home.models import *
car = Car()
car = Car(car_name = "Nexon" , speed = "120")
car = Car(car_name = "XUV 700" , speed = "150")
car.save()
 THIRD TRICK TO CREATE A OBJECT
 car_dict = {"car_name" : "Alto" , "speed" : 80}
 NOW MERGE ALL THE OBJECT USING COMMAND
 Car.objects.create(**car_dict)
7.2 READ OPERATION
 RUN THE COMMAND TO PRINT THE CAR.
 Cars = Car.objects.all()
Cars
 UNDERSTAND THE OBJECT NAME WE CAN CREATE A DEF METHOD IN MODELS FILE SO THE OBJECT
WILL BE REPLACE.
 def __str__(self) -> str:
return self.car_speed
 AFTER THAT PROCESS RUN THE COMMAND ON SHELL.
 Cars = Car.objects.all()
Cars
 IF WE NEED TO PRINT ALL THE CAR DATA THEN WE CAN RUN THIS CODE.
 for car in cars:
print(f"This Car name is {car.car_name} with high speed of {car.speed}")
 IF U WANT TO GET ONLY PARTICULAR CAR THEN WRITE THE CODE.
 car = Car.objects.get(id = 1)
car
 FILTER METHOD: WHEN THE DATA DOES NOT MATCH IT WILL RETURN THE BLANK SPACE.
 car = Car.objects.filter(id = 10)
car
<QuerySet []>
7.3 UPDATE OPRATION
 WE CAN UPDATE THE LIST USE OF 2 METHOD.
1. USING GET METHOD
car = Car.objects.get(id = 1)
car.car_name = "Creta"
car.speed = 200
car.save()
car
2. USING FILTER METHOD
car = Car.objects.filter(id = 1).update(car_name = "Verna")
Car.objects.all()
7.4 DELETE OPERATION
 RUN THE COMMAND TO DELETE THE PARITCULAR ITEMS IN LIST.
 Car.objects.get(id = 5).delete()
 IF YOU WANT TO DELETE ALL THE DATA IN LIST.
 Car.objects.all().delete()
8. RECEIPE Project
 FIRST CREATE AN APP NAMED “VEG”.
 python manage.py startapp veg
 NOTE: MODELS CLASS NAME & VIEWS DEF NAME, BOTH ARE DIFFERENT IF U GIVE SAME
NAME THEN RE PASS THE ATTRIBUTE ERROR.
 THEN CREATE A NEW MODEL IN VEG MODELS FILE.
 class Receipe(models.Model):
receipe_name = models.CharField(max_length = 100)
receipe_description = models.TextField()
receipe_image = models.ImageField(upload_to='receipe')
 NOW ADD THE APP IN CORE FOLDERS SETTINGS.PY FILE.
 'veg',
 NOW RUN THE MAKEMIGRATIONS COMMAND
 python manage.py makemigrations
 NOW RETURN THE TEMPLATE IN VIEWS.PY FILE
 def receipes(request):
return render(request, 'receipes.html')
 NOW CREATE A TEMPLATES FOLDER IN RECEIPES FOLDER & CREATE ONE FILE RECEIPES.HTML FILE
THAT FOLDER.
 NOW INHERIT THE DATA OF base.html FILE
 {% extends 'base.html' %}
{% block content %}

{% endblock %}
 NOW GIVE THE URL OF RECEIPES PAGE IN urls.py FILE.
 from veg.views import *

path('receipes/', receipes, name = "receipes"),

 NOW ADD THE FORM IN receipes.html FILE USING BOOTSTRAP WEBSITE.[Link]


 <div class="container mt-5">

<form class="col-6 mx-auto card p-3 shadow-lg">


<h2>Add Receipe</h2>
<div class="mb-3">
<label for="Receipe Name" class="form-label">Receipe Name</label>
<input type="text" class="form-control">
</div>
<div class="mb-3">
<label for="Receipe Description" class="form-label">Receipe Description</label>
<textarea name="" class="form-control"></textarea>
</div>
<div class="mb-3">
<label for="Receipe Image" class="form-label">Receipe Image</label>
<input type="file" class="form-control">
</div>
<button type="submit" class="btn btn-success">Add Receipe</button>
</form>
</div>
 NOW WE CAN ADD THE DATA FROM INPUT IN RECEIPE TO BACKEND DATA RECEIPE IN OUR
MODELS FILE USING POST METHOD, WE CAN ADD THAT METHOD IN FORM TAG.
 <form class="col-6 mx-auto card p-3 shadow-lg" method="post">
 FOR, ADDING IN A BACKEND DATA WE WILL GIVE A NAME FROM A LABLE TAG IN FORM.(THAT
NAME WHICH WE GIVEN IN MODELS.PY FILE, EX: receipe_name)
 WHEN U WANT TO UPLOAD ANY FILE THROUGH FRONTEND TO BACKEND SERVER THEN WE WILL
USE THIS TAG IN FORM TAG.
 <form class="col-6 mx-auto card p-3 shadow-lg" method="post" enctype="multipart/form-
data">
 NOW ADD ON DATA WE WILL TAKE USING THIS TAG IN views.py
 def receipes(request):
data = request.POST
print(data)
return render(request, 'receipes.html')
 IN DJANGO WHEN U PASSED THE DATA FRONTEND TO BACKEND THEN U CAN ADD THE csrf TAG IN
FORM TAG.
 {% csrf_token %}
 NOW U WANT TO GET DATA WITH THEIR LABLE NAME THEN APPLY THE IF CONDITION IN views.py
FILE.
 def receipes(request):
if request.method == "POST":
data = request.POST

receipe_image = request.FILES.get('receipe_image')
receipe_name = data.get('receipe_name')
receipe_description = data.get('receipe_description')

Receipe.objects.create(
receipe_image = receipe_image,
receipe_name = receipe_name,
receipe_description = receipe_description,
)

return render(request, 'receipes.html')


 ADD THE “REQUIRED” FIELD IN FORM TAG.
 NOW IF U WANT TO VIEW THE DATA THEN REGISTER UR RECEIPE APP IN ADMIN.PY FILE
 admin.site.register(Receipe)
 NOW REDIRECT TO THE WEBSITE.
 return redirect('/receipes/')
 GET THE RECEIPE SET IN VIEWS.PY
 Views.py
queryset = Receipe.objects.all()
context = {'receipes': queryset}
 NOW ADD THE RECEIPE IN HTML FILE USING TABLE TAG THROUGH BOOTSTRAP & FOR ITTRATING
THE DATA, ADD THE FOR LOOP IN TABLE TAG.
 ADD THE DATA IN DIV TAG.
<table class="table">
<thead>
<tr>
<th scope="col">#</th>
<th scope="col">Receipe name</th>
<th scope="col">Receipe description/th>
<th scope="col">Receipe Image</th>
</tr>
</thead>
<tbody>
{% for receipe in receipes %}
<tr>
<th scope="row">{{forloop.counter}}</th> // forloop counter use to print counting 1,2,3…
<td>{{receipe.receipe_name}}</td>
<td>{{receipe.receipe_description}}</td>
<td>{{receipe.receipe_image}}</td>
</tr>
{% endfor %}
</tbody>
</table>
 FOR SEE THE IMAGE WE CAN ADD THE MEDIA DIRECTORIES IN DJANGO.
IN MEDIA DIRECTRORIES WE CAN UNDERSTAND THE CODE OR REMEMBER THE CODE.[Link]
 NOW GO TO THE LINK & OPEN THE SETTINGS.PY.
 NOW COPY THE STATIC FILE.
 ADD THE STATIC FILES IN UR SETTINGS.PY FILE IN STATIC PART
 import os

STATIC_URL = '/static/'
STATIC_ROOT = os.path.join(BASE_DIR,'staticfiles')

STATICFILES_DIR = {
os.path.join(BASE_DIR , "public/static")
}

MEDIA_ROOT = os.path.join(BASE_DIR, 'public/static')


MEDIA_URL = '/media/'
 STATIC ROOT IS WHICH IS DJANGO ADMIN FILE, THAT CAN USE NORMALLY HTML, CSS &
MEDIA ROOT IS USE FOR MEDIA FILES.
 THOSE ROOT CAN SET IN SETTINGS.PY
 NOW RETURN THE MEDIA FILE OR ADD THE FILE USING URLS.PY
 ADD THE STATIC FILE ROOT IN URLS.PY
 from django.conf.urls.static import static
from django.conf import settings
from django.contrib.staticfiles.urls import staticfiles_urlpatterns

urlpatterns = [
path('admin/', admin.site.urls),
path('receipes/', receipes, name='receipes')
]

if settings.DEBUG:
urlpatterns += static(settings.MEDIA_URL,
document_root=settings.MEDIA_ROOT)

urlpatterns += staticfiles_urlpatterns()
 AFTER ADDING THAT U CAN ADD ANOTHER ITEM IN RECEIPE & U CAN SEE CREATE A NEW FOLDER
NAMED PUBLIC & UR IMAGE WILL BE STORE IN THAT FOLDER.
 URL FILE IS USE TO GO TO MEDIA ROUTE & UNDERSTAND THE DJANGO. OR
 SETTING.PY IS USE TO CREATE STATIC DIR OR BIND DIR & UPLOAD ALL THE FILE IN THIS DIR.
 IF U WORK WITH BIG PROJECT TO DJANGO PROFILE CANT DUMP. CDN IS CONTENT DELEVIRY
NETWORK, WE CAN UPLOAD DIRECTLY IN THAT PLACE.
 ACTUALLY, IF CREATE ANY APPLICATION THEN IT IS USE TO CDN FOR STORE & UPLOAD STATIC FILES
BCZ OF FAST ACCESS OF APPLICATION.
 NOW ADD THE <IMG> TAG TO SEE THE IMAGE ON WEBSITE.
 <td><img src="/media/{{receipe.receipe_image}}" alt="" style="height: 100px;"></td>
 IF U WANT TO DELETE SOME RECEIPE THAN ADD THE <TH> & <TD> IN HTML FILE.
 <th scope="col">Actions</th>
<td>
<button class="btn btn-danger">Delete</button>
</td>
 NOW CHANGE THE BUTTION NAME & ADD THE A HREF LINK TAG.
 <a href="" class="btn btn-danger">Delete</button>
 NOW CREATE A NEW ROUTE IN VIEWS.PY FOR HANDLE A DYNAMIC URLS.
 def delete_receipe(request, id):
 print(id)
 return HttpResponse("a")
 NOW REGISTER ON URLS.PY FILE.
 path('delete_receipe/<id>/', delete_receipe, name='delete_receipe'),
 HOW TO WORK DYNAMIC URLS IN DJANGO?
 WHEN A USER PASSES A UNIQUE ID WE WILL CREATE A DYNAMIC URL. IF WE CREATE A STATIC ID
THEN ID WILL MISSED.
 USER GO ON DYNAMIC URL & CHECK THE URL, FOR CHECK THE URL WE PASS THE QUERYSET IN THAT
QUERYSET ADMIN WILL SET IF QUERY WILL MATCHED THEN THAT CLICK ON DELETE BUTTON DELETE
THAT ID OR ITEM IN LIST & REDIRECT THE PAGE.
 def delete_receipe(request, id):

queryset = Receipe.objects.get(id = id)


queryset.delete()
return redirect('/receipes/')
 NOW ADD THE URL LINK IN HTML FILE.
 <a href="/delete-receipe/{{receipe.id}}" class="btn btn-danger">Delete</button>
 CHECK THE WEBSITE & ALL SET WE CAN DELETE ANY ITEMS & ADD.
 CREATE A NEW ROUTE IN VIEWS.PY FILE FOR UPDATE THE ITEMS.
 def update_receipe(request, id):

queryset = Receipe.objects.get(id = id)


context = {'receipe': queryset}
return render(request, 'update_receipe.html', context)
 NOW CREATE A NEW HTML FILE IN TEMPLATES FOLDER & GIVE THE NAME AS ABOVE
’update_receipe.html', ADD THE ALL DATA SAME AS RECEIPES.HTML FILE & ADD VALUES IN LABLE
TAG.
 {% extends 'base.html' %}
{% block content %}

<div class="container mt-5">

<form class="col-6 mx-auto card p-3 shadow-lg" method="post" enctype="multipart/form-data">


{% csrf_token %}
<h2>Update Receipe</h2>
<hr>
<div class="mb-3">
<label for="Receipe Name" class="form-label">Receipe Name</label>
<input name="receipe_name" value="{{receipe.receipe_name}}" type="text" class="form-
control" required>
</div>
<div class="mb-3">
<label for="Receipe Description" class="form-label">Receipe Description</label>
<textarea name="receipe_description" class="form-control"
required>{{receipe.receipe_description}}</textarea>
</div>
<div class="mb-3">
<label for="Receipe Image" class="form-label">Receipe Image</label>
<input name="receipe_image" type="file" class="form-control">
</div>
<button type="submit" class="btn btn-success">Update Receipe</button>
</form>
</div>

{% endblock %}

 NOW ADD THE LINK IN URLS.PY FILE.


 path('update-receipe/<id>/', update_receipe, name='update_receipe'),
 AGAIN CHECK THE LOGIC & WRITE THE IF LOGICAL CODE IN VIEWES.PY FILE & ALL SET.
 def update_receipe(request, id):
queryset = Receipe.objects.get(id = id)

if request.method == "POST":
data = request.POST

receipe_image = request.FILES.get('receipe_image')
receipe_name = data.get('receipe_name')
receipe_description = data.get('receipe_description')

queryset.receipe_name = receipe_name
queryset.receipe_description = receipe_description

# FOR ADDING THE RECEIPE IMAGE, ADD ANOTHER LOGIC ON IMAGE ATTRIBUTE

if receipe_image:
queryset.receipe_image = receipe_image

queryset.save()
return redirect('/receipes/')

context = {'receipe': queryset}


return render(request, 'update_receipe.html', context)
 NOW CREATE A SEARCH FUNCTIONALTY IN WEBSITE.
 <hr>
<div class="mt-5">
<div class="mx-auto col-6">
<form action="">
<div class="mb-3">
<label for="Receipe Name" class="form-label">Search
Food</label>
<input name="Search" type="text" class="form-
control">
</div>
<button type="submit" class="btn btn-
primary">Search</button>
</form>
</div>
</div>
 HOW TO TAKE AWAY SEARCH KEY IN BACKEND?
 WE USE A GET METHOD TO PASS THE KEY IN BACKEND.
 ADD THE GET METHOD IN VIEWS.PY FILE THIS METHOD CAN PRINT THE NAME WHAT U HAVE
SEARCH.
 # ADD THE SEARCH KEY
if request.GET.get('Search'):
print(request.GET.get('Search'))
 IF U WANT TO FILTER THE DATA THEN ADD THE QUERYSET & ICONTAINS KEYWORD.
 # ADD THE SEARCH KEY
if request.GET.get('Search'):
queryset = queryset.filter(receipe_name__icontains =
request.GET.get('Search'))
9. Advance Authentication
 WHAT IS AUTHENTICATION?
 It’s used for two different module like admin or user, admin is a authenticated person that can
allow to changes in website. The 2nd one user is unauthenticated person that can not allow to
changes in website.
 FIRST ADD THE USER MODEL IN MODELS.PY FILE.
 from django.contrib.auth.models import User
# In receipe class we can add the user
 user = models.ForeignKey(User, on_delete = models.SET_NULL, null = True, blank = True)
 models.CASCADE: it means if user delete than their related all receipe or files are also deleted.
 models.SET_NULL: it means if user delete than all the related items are go for null value.
 NOW RUN THE MAKEMIGRATIONS & MIGRATE COMMAND.
 CREATE A TWO NEW FILE IN TEMPLATES FOLDER & ADD THE CODE USING BOOTSTRAP.
 register.html
 login.html
 {% extends 'base.html' %}
{% block content %}

<div class="container mt-5">

<form class="col-6 mx-auto card p-3 shadow-lg" method="post"


enctype="multipart/form-data">
{% csrf_token %}
<h2>Login</h2>
<hr>
<div class="mb-3">
<label for="exampleInputEmail1" class="form-
label">Username</label>
<input type="text" class="form-control"
id="exampleInputEmail1" aria-describedby="emailHelp">
<div id="emailHelp" class="form-text">We'll never share your
email with anyone else.</div>
</div>
<div class="mb-3">
<label for="exampleInputPassword1" class="form-
label">Password</label>
<input type="password" class="form-control"
id="exampleInputPassword1">
</div>
<button type="submit" class="btn btn-primary">Submit</button>
</form>
</div>

{% endblock %}
 NOW ADD THE LOGIN PAGE IN VIES.PY FILE & SET THE URLS IN URLS.PY FILE.
 views.py

def login_page(request):
return render(request, 'login.html')
 urls.py
 path('login/', login_page, name='login_page'),
 CREATE REGISTER PAGE SAME AS ABOVE TECHNIC.
 ADD THE <P> TAG BOTH PAGES & GIVE TO LINK THE REGISTER & LOGIN.
 register.html

<P>
Already have account <a href="/login/">Login</a>
</P>
 login.html

<P>
Don't have account <a href="/register/">Register</a>
</P>
 LET’S ADD THE USER FIELD.
 DJANGO CAN AUTOMATICALLY GIVE THE FIELD FOR USR LET’S SEE.
 YOU CAN JUST CLICK(CTRL+MOUSE) THE User in Models.py file, NOW U CAN SEE THE ONE
MODELS.PY PAGE ON U SCREEN & SEE THE USER PROPERTY.
 class User(AbstractUser):
"""
Users within the Django authentication system are represented by this
model.

Username and password are required. Other fields are optional.


"""

class Meta(AbstractUser.Meta):
swappable = "AUTH_USER_MODEL"
 NOW CLICK ON ABSTRACTUSER & SEE THE ALL USER FIELD LIKE F_NAME, L_NAME.
 NOW ADD THE ALL USER RELATED FIELD IN OUR FILE.

<div class="mb-3">
<label for="exampleInputEmail1" class="form-label">First
Name</label>
<input type="text" class="form-control"
id="exampleInputEmail1" aria-describedby="emailHelp">
</div>
<div class="mb-3">
<label for="exampleInputEmail1" class="form-label">Last
Name</label>
<input type="text" class="form-control"
id="exampleInputEmail1" aria-describedby="emailHelp">
</div>
 ADD THE NAME FIELD IN INPUT TAG & GIVE A NAME ALL THE RELATED FIELD.
 NOW IMPORT THE MODEL & ADD THE IF CONDITION IN VIEWS.PY FILE SAME AS PREVIOUS TECH.
 from django.contrib.auth.models import User
 def register(request):

if request.method == "POST":
first_name = request.POST.get('first_name')
last_name = request.POST.get('last_name')
username = request.POST.get('username')
password = request.POST.get('password')

user = User.objects.create(
first_name = first_name,
last_name = last_name ,
username = username,
)
# FOR ENYCRPT THE PASSWORD, CALL THE USER TO SET PASSWORD.
user.set_password(password)
user.save()

return redirect('/register/')

return render(request, 'register.html')

 LET’S CHECK THE REGSITER PAGE & ENTER THE DATA IN FIELD.
 U CHECK THE ENTERED DATA IN SHELL USING THE GIVEN COMMAND IN LINK.[Link]
 FOR IMPORT THE REGISTER DATA IN SHELL RUN THE COMMAND.
 from django.contrib.auth.models import *
 User.objects.all()
 NOW IF U ENTER THE SAME USERNAME THAN DJANGO PASSED THE UNIQUE CONSTRAINT ERROR
BCZ OF THE USERNAME WILL ALWAYS A DIFFERENT.
 FOR CHECK THE SAME USERNAME ARE IN OR NOT IN FOR THAT WE CAN ADD THE QUERY IN
VIEWS.PY FILE.
 user = User.objects.filter(username = username)

if user.exists():
return redirect('/register/')
 NOW U WANT TO SHOW THE ERROR WHEN A SAME USERNAME ARE EXISTS.
 FOR THAT DJANGO GIVE A SOME MESSAGES IN THEIR SYTEM WE CAN SIMPLY IMPORT THE
MESSAGES.[Link] in this link u can see the import message pack & add our views.py file.
 from django.contrib import messages
 AFTER IMPORTING THE MESSAGE PACK ADD THE CODE IN REGISTER ROUTE
 if user.exists():
messages.info(request, "Username already exists.")
return redirect('/register/')
 ANOTHER MESSAGE FOR ACCOUNT CREATED SUCCESSFULLY IN BELOW TO USER.SAVE().
 user.set_password(password)
user.save()
messages.info(request, "Account created Successfully")
return redirect('/register/')
 FOR GET THE MESSAGE U ALSO ADD THE REQUEST IN YOUR REGISTER.HTML FILE.
 {% if messages %}
<ul class="messages">
{% for message in messages %}
<li{% if message.tags %} class="{{ message.tags }}"{% endif %}>{{ message }}</li>
{% endfor %}
</ul>
{% endif %}
 NOW ADD SOME BOOTSTRAP ALERT BOX IN DOCUMENT & CUSTMIZE THE CODE.
 {% if messages %}
<!-- {{ message.tags }} -->
<div class="alert alert-primary" role="alert">
{% for message in messages %}
{{ message }}
{% endfor %}
</div>

{% endif %}
 NOW U CAN CHECK THE WEBSITE FOR SAME USERNAME & ANOTHER NEW USERNAME U CAN SEE
THE MESSAGE.
 NOW CREATE SAME AS A LOGIN PAGE WHEN USER ENTER THE USERNAME OR PASSWORD IT CAN
SEE THE ITEMS & ACCESS IT.
 IN THIS, PROCESS WE CAN ADD THE POST METHOD IN LOGIN ROUTE & APPLY A FILTER FOR A GET
SAME USER NAME IN SYSTEM OR NOT.
if request.method == "POST":
username = request.POST.get('username')
password = request.POST.get('password')

if not User.objects.filter(username = username).exists(): #


exists(): it is a boolean value.
messages.info(request, "Invalid Username")
return redirect('/login/')
 .exists(): it’s a boolean value that can pass the true & false value either username is matched that it
will get the true value nor it will get false & when false value come their, it will pass an error message
in sytem.
 Password does’t work like this bcz it is a encrypted for that case we can use a django authenticate
functionality. It’s a do for import authenticate pack & write the if condition.
 user = authenticate(username = username, password = password)

if user is None: # PASSWORD IS NOT MATCHED.


messages.info(request, "Invalid Password")
return redirect('/login/')
 IF PASSWORD IS MATCHED WHEN WE ADD THAT PASSWORD IN BROWSER SESSION.
 SESSION: in this browser will be save some user log or items in browser automatically. (ex.,
password, username, login details.)
 IMPORT THE ONE LOGIN METHOD.
 from django.contrib.auth import authenticate, login
 IF PASSWORD IS MATCHED WHEN THE ENTER THE CONDITION.

else:
login(request, user)
return redirect('/receipes/')
 IMP: ROUTE NAME & IN ELSE CONDITION NAME BOTH ARE DIFFERENT.
 CODE FOR LOGIN ROUTE FOR FULL LOGIN ACCESS.

def login_page(request):
if request.method == "POST":
username = request.POST.get('username')
password = request.POST.get('password')
if not User.objects.filter(username = username).exists(): #
exists(): it is a boolean value.
messages.info(request, "Invalid Username")
return redirect('/login/')
user = authenticate(username = username, password = password)
if user is None: # PASSWORD IS NOT MATCHED.
messages.info(request, "Invalid Password")
return redirect('/login/')
else:
login(request, user)
return redirect('/receipes/')
return render(request, 'login.html')
 ADD THE USERNAME IN RECIEPES PAGE U CAN ADD THE REQUEST IN RECEIPES.HTML FILE.
 {{request.user}}
{{request.first_name}}
 CREATE A NEW LOG OUT PAGE IN views.py FILE ADD THE IMPORT METHOD LOGOUT.
 from django.contrib.auth import authenticate, login, logout
def logout_page(request):
logout(request)
return('/login/')
 ADD THAT ROUTE IN urls.py FILE.
FOR LOGOUT WE CAN ADD THE LOG OUT BUTTON IN NAVBAR USING BOOTSTRAP IN BASE.HTML
FILE.[Link]
 <nav class="navbar dark p-3 bg-danger shadow-lg">

<div class="container-fluid">
<a class="navbar-brand">Navbar</a>
<form class="d-flex" role="search">
{% if request.user.is_authenticated %}
<a href="/logout/" class="btn btn-success" type="submit">Log
Out</a>
{% else %}
<a href="/login/" class="btn btn-success"
type="submit">Login</a>
{% endif %}
</form>
</div>
</nav>
 In above code we also mention the if..else condition in that the condition is if user is
authenticated then it will get a login & see the logout button but else if user is noe logged in
then it will redirect the login page.
 BUT THE ONE PROBLEM IS THAT, ANYONE CAN ACCESS THE RECEIPES PAGE FOR THAT WE CAN
ADD THE DECORATOR METHOD AUTHENTICATE CONDITION LIKE LOGIN REQUIRED.
 from django.contrib.auth.decorators import login_required
 AND U WANT TO ACCESS ANY PAGE OF LOGIN REQUIRED THAN U CAN ADD CODE ABOVE THE
ROUTE & GIVE THE URL OF LOGIN PAGE.
 @login_required(login_url="/login/")
def receipes(request):
10. Master Django ORM
 SUPPOSE WE HAVE ENTER THE COUNT FUNCTIONALLYTIES IN MODELS
 receipe_view_count = models.IntegerField(default= 1)
 NOW MIGRATE THE MODELS & OPEN THE SHELL IN CMD.
 IMPORT THE ALL THE RECEIPES.
 from veg.models import *
 CHECK THE HOW MANY RECEIPES IN SYSTEM.
 veg = Receipe.objects.all()
 NOW GIVE THE RANDOM NUMBER FOR THAT IMPORT THE RANDOM IN SHELL.
 import random
 ADD THE FOR CONDITION FOR GIVING THE RANDOM NUMBERS USING COUNT MODEL.
 for vege in veg:
vege.receipe_view_count = random.randit(10, 100)
vege.save()
 NOW CHECK THE RECEIPE ALL RECEIPES PASS THE DIFFRENET NUMBER.
 veg[0].receipe_view_count
 NOW THAT DATA HOW WE MANAGE IN ORDERING OR SORT BY.
 veg = Receipe.objects.all().order_by('receipe_view_count') # it can pass the assending order
set.
 veg = Receipe.objects.all().order_by('-receipe_view_count') # it can pass the desending order
set.
 IF U HAVE A BIG DATA THAN APPLY THE LIMIT.
 veg = Receipe.objects.all().order_by('-receipe_view_count')[0:1]
 IF U WANT TO FILTER SOME RECEIPE FROM THEIR COUNT BASE.
 veg = Receipe.objects.filter(receipe_view_count__gte = 45) #__gte means greater than 45
 veg = Receipe.objects.filter(receipe_view_count__lte = 45) #__lte means less than 45
 LETS CREATE A SOME NEW MODELS FOR.
class Department(models.Model):
department = models.CharField(max_length = 100)

def __str__(self) -> str:


return self.department

class Meta:
ordering = ['department'] #Meta class for department can see
sequence vise

class StudentID(models.Model):
student_id = models.CharField(max_length = 100)

def __str__(self) -> str:


return self.student_id

class Student(models.Model):
department = models.ForeignKey(Department, related_name ="depart",
on_delete=models.CASCADE)
student_id = models.OneToOneField(StudentID, related_name ="studentid",
on_delete=models.CASCADE)
student_name = models.CharField(max_length = 100)
student_email = models.EmailField(unique=True)
student_age = models.IntegerField(default=18)
student_address = models.TextField()

def __str__(self) -> str:


return self.student_name

class Meta:
ordering =['student_name']
verbose_name = "student"
 NOW CREATE A SUPERUSER IN DJANGO ADMIN.
 python manage.py createsuperuser
 REGISTER THE ADMIN IN ADMIN.PY FILE.
 admin.site.register(Receipe)
admin.site.register(StudentID)
admin.site.register(Student)
admin.site.register(Department)
 NOW LOGIN ON DJANGO ADMINISTRATOR USING USERNAME & PASSWORD.
 FOR, ADD THE LARGE DATA WE ADD SOME PYTHON FEATURES “FAKERS” LIBRARY[Link].
 CREATE A NEW FILE NAMED “SEED.PY” & ADD THE FAKER CODE IN THIS FILE.
 from faker import Faker
 fake = Faker()
 from .models import *
 import random
 CREATE A NEW FUNCTION FOR ADD SOME FAKE DATA & GIVE THE NUMBER TO ENTER THE DATA
OF THAT COUNT.
 NOW ITTRATE THE FOR IN RANGE.
 def seed_db(n=10)->None:
for i in range(0, n):

[1, 2, 3, 4]
department_objs = Department.objects.all()
randome_index = random.randint(0, len(department_objs)) # FOR ADDING
THE RANDOM INDEX NUMBER
department = department_objs[randome_index]
student_id = f'STU-0{random.randit(100, 900)}' # FOR ADDING A RANDOM
NUMBER IMPORT THE RANDOM FUNCTION
student_name = fake.name()
student_email = fake.email()
student_age = random.randint(20, 30)
student_address = fake.address()
 LET’S CREATE A OBJECT FOR STUDENTS ID.
 student_id_obj =StudentID.objects.create(student_id = student_id)
 NOW CREATE A OBJECT FOR STUDENTS DETAIL.
 student_obj = Student.objects.creat()
department = department,
student_id = student_id_obj,
student_name = student_name,
student_email = student_email,
student_age = student_age,
student_address = student_address,
 NOW USE THE “SOURCERY” EXTENSIONS FOR REPLACE THE INDEX ERROR JUST RIGHT CLICK ON
FOR IN RANGE & 1ST OPTION U WILL SHOW THE REPLACE INDEX CLICK ON THAT.

 BCZ OF A CODE IS NOT BLOCKED, CAN ADD THE TRY EXPECTION IN FOR IN RANGE.

 NOW ACTIVATE THE SHELL IN CMD.

 AND IMPORT THE ALL MODELS FROM SEED.


 from veg.seed import *
 IF U SEE THE ERROR ON THAT RUNNING TIME FOR THAT U INSTALL THE FAKER PACKEGE IN UR
CMD
 SIMPLY EXIT THE SHELL USING (EXIT) & RUN THIS COMMAND IN CMD.
 pip install faker
 NOW AGAIN RUN THE SHELL & IMPORT THE SEED.
 NOW RUN THE SERVER IN VS CODE TERMINAL.
 NOW RUN THE COMMAND IN SHELL FOR ADDING THE FAKE REPORT.
 seed_db()
 RUN UR DJANGO ADMIN & SEE THE FAKE REPORT ARE UPLOADED.
11. Advanced queries
 DISCUSS ABOUT HOW TO PERFOME OPERATIONS.
 FIRST OPEN THE SHELL & IMPORT THE MODEL.
 NOW U WANT TO FILTER THE STUDENT NAME & GET THE ONE DATA OF STUDENT FOR THAT U CAN
RUN THIS COMMAND. (__startswith it means the name starting spell)
 queryset = Student.objects.filter(student_name__startswith = "jay")
 queryset
 SAME AS A START THE ANOTHER KEYWORD IS ENDSWITH (__startswith it means the name starting
spell)
 queryset = Student.objects.filter(student_email__endswith = ".org")
 queryset
 IF U DON’T UNDERSTAND THEN U CAN PRINT ALL THE DATA FOR THIS METHOD.
 for q in queryset:
print(q.student_email)
 NOW RUN THE ICONTAINS QUERY, IN THIS QUERY WE GET THE NAME OF SPECIFIC WORD IN ANY
FULL NAME OR BETWEEN THE NAMES.
 queryset = Student.objects.filter(student_name__icontains = "An")
 queryset
 HOW TO ACCESS THE FOREIGN KEY OR DEPARTMENT ANY STUDENT FOR THAT FIRST WE FIND THE
ANY STUDENT ADDRESS. (“__” it can use to call the function or u can access the foreign key)
 queryset = Student.objects.filter(student_address__icontains = "Jenniferchester")
queryset
queryset[0].student_id
 IN DJANGO PK & ID IS SET DEFAULT & ALSO BOTH ARE SAME SO WE ACTUAL RUN THIS COMMAND
THEN WE GET A SAME NUMBER.
 queryset[0].id
6
queryset[0].pk
 U WANT TO ANY DEPARTMENT IN THE DATABASE SO U FIND THIS.
 queryset = Student.objects.filter(department__department = "Biotechnical")
queryset
 NOW SUPPOSE U WANT TO ONE OR MANY DEPARTMENT AT A TIME.
 FOR, THAT U CAN CREATE A SIMPLE ARRAY IN SHELL.
 STRING & INT NEVER COMPARED.
 FOR COMAPERING THE STRING WE CAN ADD THE STRING VALUE LIKE.
 queryset = Student.objects.filter(department__department__in = d)
queryset
 SUPPOSE U WANT TO ALL THE DEPARTMENT DATA BUT NOT ONE DEPARTMENT FOR THAT WE CAN
ADD THE “EXCLUDE” KEYWORD. (exclude keyword use for a remove that particular data)
 queryset = Student.objects.exclude(department__department = "Mechenical")
 queryset.count()
 NOW WE OPEN THE QUERYSET API.[Link]
 USE THE EXISTS FUNCTION, THIS FUNCTION IS USE TO IN DJANGO IF THE QUERY IS TRUE THAN
RETURN TRUE, OR FALSE THAN RETURN FALSE LIKE A BOOLEAN VALUE.
 queryset = Student.objects.filter(student_name = "Umang")
 queryset.exists()
 False
 FOR ADDING THE LIMIT TO DATA GETTING.
 queryset = Student.objects.all()
 queryset[0:50] # USE FOR DATA LIMIT
 IF U GET THE VALUE OF ALL THE STUDENT DATA.
 queryset.values()
 IF U WANT TO ANY 1 STUDENTS VALUE & AGE.
 queryset.values()[0]
 queryset.values()[0]['student_age']
 WHAT TO DO VALUES?
 Values can serialize the data. U can’t use the dot(.) in values. Values are used to pass the data on
API server etc.
 IF U WANT TO REVERSE THE DATA THAN USE THE REVERSE KEYWORD.
 queryset = Student.objects.all()
 queryset.reverse()
 IF U WANT TO ANY TWO VALUE IN THE DATA THAN U CAN USE THE VALUES_LIST KEYWORD.
 IT CAN RETURN THE DATA IN TUPLE FORMAT.
 queryset = Student.objects.values_list('id', 'student_name')
 queryset
 GET KEYWORD: GET RETURN THE EXCEPTION, IF U HAVE CONFIDENT WITH UR DATA THEN U CAN
USE GET.
 queryset = Student.objects.get(id = 140)
12. Aggregation and Annotation
 AGGREGATE FUNCTION:
 IT IS RUN ON SINGLE RAW DATA. (EX., ONLY MARKS RAW OR STUDENT NAME)
 IT IS AUTOMATCALLY GIVES U SUM, AVERAGE OR ETC.
 ANNOTATE FUNCTION:
 IT IS USE FOR MULTIPLE RAW DATA.

 SUPPOSE WE WANT TO AVERAGE DATA FOR STUDENTS AGE USING AGGREGATE FUNCTION.
 from django.db.models import *
 from veg.models import *
 Student.objects.aggregate(Avg('student_age'))
 Student.objects.aggregate(Max('student_age'))
 Student.objects.aggregate(Min('student_age'))
 Student.objects.aggregate(Sum ('student_age'))
 NOW WE WANT TO BETWEEN THE AGE DATA USING ANNOTATE FUNCTION.
 from django.db.models import *
 from veg.models import *
 student = Student.objects.values('student_age').annotate(Count('student_age'))
 student
 student = Student.objects.values('department').annotate(Count('department'))
 student
 NOW U WANT TO MULTIPLE DATA GET OF STUDENTS.
 student = Student.objects.values('department', 'student_age').annotate(Count('department'),
Count('student_age')).values_list
 student
13. Students Report Card
 FIRST CREATE TWO MODELS IN MODELS.PY FILE FOR STUDENTS SUBJECT & MARKS DATA.
 class Subject(models.Model):
subject_name = models.CharField(max_length = 100)

 class StudentMarks(models.Model):
student = models.ForeignKey(Student, related_name="studentmarks",
on_delete=models.CASCADE)
subject = models.ForeignKey(Subject, on_delete= models.CASCADE)
marks = models.IntegerField()
 IN DATABASE PARTICULAR STUDENT MARKS ARE UNIQUE, IT MEANS ONSE STUDENT DO NOT GET
2 TIMES MARKS IN 1 SUBJECT FOR THAT WE CAN ADD THE UNIQUE METHOD IN META CLASS FOR
BELOW SUBJECTMARKS CLASS.
 class Meta:
unique_together = ['student' , 'subject']
 NOW WE CAN ALSO ADD ABOVE THAT DEF FUNCTION USING F STRING.
 def __str__(self) -> str:
return f'{self.students.student_name} {self.subject.subject_name}'

 LET’S CREATE A SOME FAKE STUDENTS AGAIL USING SHELL COMMAND.


 from veg.seed import *
seed_db(100)
 NOW CREATE A SAME FAKE REPORT OF STUDENTS MARKS IN SEED.PY FILE.
 def create_subject_marks(n):
try:
student_objs = Student.objects.all() # we get the students objects
for student in student_objs: # ittrate the students
subjects = Subject.objects.all() # get all subjects
for subject in subjects:
SubjectMarks.objects.create(
subject = subject,
student = student,
marks = random.randint(0, 100)
)

except Exception as e:
print(e)
 FOR DISPLAYING THE SUBJECT & MARKS AT A ONE DISPLAY FOR THAT WE ADD THE CLASS IN
ADMIN.PY.
 class SubjectMarkAdmin(admin.ModelAdmin):
list_display = ['student', 'subject', 'marks']
admin.site.register(SubjectMarks , SubjectMarkAdmin)
 FOR SEE THE SUBJECT NAME WE CAN RETURN THE DEF FUNCTION IN BELOW THE SUBJECT CLASS
IN MODELS.
 def __str__(self) -> str:
return self.subject_name
 NOW WE CAN GET THE DATA IN FRONTEND FROM DJANGO ADMIN TO FRONTEND PAGE.
 FIRST WE CAN ADD THE LOGIC IN VIEWS.PY PAGE.
 def get_student(request):
queryset = Student.objects.all()
return render(request, 'report/students.html' , {'queryset' : queryset})
 NOW CREATE A NEW FOLDER IN TEMPLATE FOLDER NAMED REPORT & IN THAT CREATE A NEW
FILE NAMED STUDENTS.HTML
 REGISTER IN URLS.PY FILE.
 NOW CREATE A SIMPLE TABLE IN STUDENTS.HTML FILE & ADD THE CODE FOR DISPLAYING THE
STUDENTS.
 {% extends 'base.html' %}
{% block content %}

<div class="container mt-5">

<table class="table table-striped">


<thead>
<tr>
<th scope="col">#</th>
<th scope="col">student_id</th>
<th scope="col">Department</th>
<th scope="col">student_name</th>
<th scope="col">student_email</th>
<th scope="col">student_age</th>
</tr>
</thead>
<tbody>
{% for student in queryset %} <!-- IMPORTING THE STUDENTS IN
queryset -->
<tr>
<th scope="row">{{forloop.counter}}</th> <!-- FOR LOOP
COUNTER FOR AUTOMATED NUMBER -->
<td>{{student.student_id}}</td>
<td>{{student.department.department}}</td>
<td>{{student.student_name}}</td>
<td>{{student.student_email}}</td>
<td>{{student.student_age}}</td>
</tr>
{% endfor %}
</div>
{% endblock %}
 NOW ADD THE PAGINATION ON THE DATA.[Link]
 PAGINATION IS THE METHOD TO COMPRESS THE BIG DATA & GIVE THE PAGES ON BELOW
SCREEN.

 ADD THE PAGINATION IN VIEWS.PY FILE.


 from django.core.paginator import Paginator

def get_student(request):
queryset = Student.objects.all()
paginator = Paginator(queryset, 25) # Show 25 contacts per page.
page_number = request.GET.get("page" , 1)
page_obj = paginator.get_page(page_number)
print(page_obj)
return render(request, 'report/students.html' , {'queryset' : page_obj})
 this record only for 1st page, for view the 2nd page code here we can add some bootastrap ui
code.
 <nav aria-label="Page navigation example">

<ul class="pagination">
{% if queryset.has_previous %}
<li class="page-item"><a class="page-link" href="?page=1">&laquo; first</a></li>
<li class="page-item"><a class="page-link" href="?page={{ queryset.previous_page_number
}}">previous</a>
</li>
{% endif %}

<span class="current">
Page {{ queryset.number }} of {{ queryset.paginator.num_pages }}.
</span>

{% if queryset.has_next %}
<li class="page-item"><a class="page-link" href="?page={{ queryset.next_page_number
}}">next</a></li>
<li class="page-item"><a class="page-link" href="?page={{ queryset.paginator.num_pages
}}">last &raquo;</a>
</li>
{% endif %}
</ul>
</nav>
</div>
{% endblock %}
 NOW ADD THE FILTER ON RECORD.
 if request.GET.get('search'):
search = request.GET.get('search')
queryset = queryset.filter(student_name__icontains = search)
 FOR ADDING THE SEARCH BUTTON
 <form>
<div class="row">
<div class="col-md-6">
<input class="form-control" placeholder="search">
</div>

<div class="col-md-6">
<button class="btn btn-success">Search</button>
</div>
</div>
</form>
 NOW ADD THE ALL DATA ARE FILTERED FOR THAT WE CAN ADD OR CONDITON.
 from django.db.models import Q
 if request.GET.get('search'):
search = request.GET.get('search')
queryset = queryset.filter(
Q(student_name__icontains = search) |
Q(department__department__icontains = search) |
Q(student_id__student_id__icontains = search) |
Q(student_email__icontains = search)
)
 GENERATE THE REPORT CARD. (EX., Rank, Marks,Etc…)
 SUPPOSE ANYONE CLICK ON STUDENTS ID THAN THEY GET ALL THE MARKS THE STUDENTS.
 LET’S CREATE A ONE PAGE FOR SEEING THE MARKS OF STUDENTS.
 def see_marks(request, student_id): # for using student_id see the marks
queryset = SubjectMarks.objects.filter(student__student_id__student_id = student_id)
return render(request , 'report/see_marks.html', {'queryset' : queryset})
 NOW ADD ROUTE IN URLS.
 NOW CREATE A LINK IN HTML FILE IN THE STUDENT_ID TD TAG.
 <td>
<a href="/see-mark/{{student.student_id}}">
{{student.student_id}}
</a>
</td>
 NOW SUPPOSE U WANT TO CHANGE THE ROUTE NAME IN URLS FOR THAT U CAN ALSO CHANGE
THE NAME IN ALL FILES IT’S CALLED DEPENDANCY, IN A BIG DATA WE CAN SET THE DEPENDANCY
THAT AUTOMATE CHANGE THE ROUTE NAME IF U ONCE CHANGED.
FOR THAT U CAN USE DJANGO URLS.
 <td>
<a href="{% url 'see_marks' student.student_id %}">
{{student.student_id}}
</a>
</td>
 NOW CREATE A NEW FILE SEE_MARKS.HTML. ADD THE SEE MARKS LOGIC CODE IN TABLE, APPLY IF
CONDITION & ADD THE MARKS.MARKS CONDITION.
 {% extends 'base.html' %}
{% block content %}
<div class="container mt-5">
<!-- TABLE FOR THE STUDENTS DATA -->
<table class="table table-striped">
<tbody>
{% for marks in queryset %} <!-- IMPORTING THE STUDENTS IN
queryset -->
<tr>
<th scope="row">{{forloop.counter}}</th> <!-- FOR LOOP
COUNTER FOR AUTOMATED NUMBER -->
<td>
<b>{{marks.subject.subject_name}}</b> <!--ADD THE
SUBJECT NAME OF STUDENTS-->
</td>
<td>{{marks.marks}}</td>
</tr>
{% endfor %}
</tbody>
</table>
</div>
{% endblock %}
 NOW WE CAN ADD THE RANK DISPLAYING CODE.
 HTML CODE
 <h4>Rank :</h4>
 <h4>Total : {{total_marks.total_marks}}</h4>
 NOW ADD THE AGGREGATE FUNCTION FOR TOTAL IN VIEWS.PY
 total_marks = queryset.aggregate(total_marks = Sum('marks'))
print(total_marks)
 ADD THE total_marks IN RETURN FUNCTION.
 GENERATE THE STUDENTS RANK.
 FOR SORTING THE MARKS USING ANNOTATE FUNCTION.
 ranks = Student.objects.annotate(marks = Sum('studentmarks__marks')).order_by('-marks' , '-
student_age')
for rank in ranks:
print(rank.marks)
 NOW ADD THE CODE FOR DISPLAY THE RANK IN VIEW.PY
 current_rank = -1
ranks = Student.objects.annotate(marks = Sum('studentmarks__marks')).order_by('-marks' , '-
student_age') #ANNOTATE FUNCTION FOR ORDER BY THE STUDENTS MARKS
i=1
for rank in ranks:
if student_id == rank.student_id.student_id:
current_rank = i
break
i=i+1

 ADD THE CURRENT_RANK FUNCTION IN SEE_MARKS FILE FOR DISPLAYING THE RANK.
 BUT THIS TRICK IS WRONG BCZ OF ITS TIME CONSUMING PROCESS,
 FOR THAT WE CAN CREATE A NEW MODEL IN THAT WE CAN STORE ALL THE RANKS OF STUDENT &
WORK IT WITH.
 class ReportCard(models.Model):
student = models.ForeignKey(Student, related_name="studentreportcard",
on_delete=models.CASCADE)
student_rank = models.IntegerField()
date_of_report_card_generation = models.DateField(auto_now_add = True)
 MIGRATIONS APPLY.
 ADD SCRIPTS FOR GENERATING THE REPORT CARD IN SEED FILE.
 def generate_report_card():
current_rank = -1
ranks = Student.objects.annotate(marks = Sum('studentmarks__marks')).order_by('-marks' , '-
student_age')
i=1
for rank in ranks:
print(rank)
ReportCard.objects.create(
student = rank,
student_rank = i
)
i=i+1
 NOW ADD THE UNIQUE TOGETHER IN META CLASS IN MODEL FILE.
 class Meta:
unique_together = ['student_rank', 'date_of_report_card_generation']
 NOW REGISTER IN ADMIN OR LIST DISPLAY THE FUNCTION AFTER THAT WE CAN DISPLAYING THE
TOTAL MARKS FOR THAT WE CAN ADD SOME CODE IN ADMIN SITE.
 class ReportCardAdmin(admin.ModelAdmin):
list_display = ['student', 'studnet_rank', 'total_marks' ,'date_of_report_card_generation']
def total_marks(self, obj): # total_marks key are not available for that we can add the custom method.
subject_marks = SubjectMarks.objects.filter(student = obj.student)
return subject_marks.aggregate(makrs = Sum('marks'))
admin.site.register(ReportCard , ReportCardAdmin)
 NOW ADD THE ORDERING FOR THAT WE CAN ADMIN FILE ABOVE ADD DEF TOTAL MARKS.
 ordering = ['-student_rank']
 NOW ADD THE RANK IN FRONTEND FOR THAT ADD IN HTML FILE & REMOVE THE RANK METHOD
IN VIEWS FILE.
 <h4>Rank : {{queryset.first.student.studentreportcard.first.student_rank}}</h4>
 NOW SAME AS ADD THE DORG.
14. Custom User Model
 WHAT IS CUSTOM USER MODEL?
 Users within the Django authentication system are represented by this model. Username and
password are required. Other fields are optional.
 WHAT IS ABSTRACTUSER?
 An abstract base class implementing a fully featured User model with admin-compliant
permissions.
 DIFFRENCE BETWEEN ABSTRACTUSER CLASS & ABSTRACTBASEUSER?
 ABSTRACTUSER : In this class we can use django field & also add new field. We can combine
both models & create a new model.
 ABSTRACTBASEUSER : If u want to start scratch or fully independent than u can use this class. U
have only password & usernamee field in this class.
 NOW LETS CREATE A NEW APP NAMED “account” & REGISTER IN SETTINGS.PY FILE.[Link]
 LET’S IMPORT THE ABSTRACTUSER MODELS & CREATE A CLASS.
 from django.contrib.auth.models import AbstractUser

class CustomUser(AbstractUser):
phone_number = models.CharField(max_length = 12, unique=True)
user_bio = models.CharField(max_length = 75)
user_profile_image = models.ImageField(upload_to="profile")
# ADD MANUALLY USERFEILD IN WEBSITE
USERNAME_FIELD = 'phone_number' # WHAT U WANT TO LOGIN TIME ADD
REQUIRED_FIELDS = []
 ADD THE MODEL MANAGER.
 FOR THAT WE CAN CREATE A NEW FILE MANAGER.PY & ADD BACKEND CODE FOR UNDERSTAND
THE WEBSITE WHAT WE PASSED.
 NOW ADD TH BASE USER MANAGER IN FILE
 from django.contrib.auth.base_user import BaseUserManager
 NOW U WORK WITH THOSE IN DJANGO MOST OF THAT ARE BUILT IN WE CAN ONLY MODIFY THE
CLASSES.
 NOW ADD A CREATE USER MATHOD IN USERMANAGER CLASS & PASS THE SELF PERAMETER.
 class UserManager(BaseUserManager):
def create_user(self, phone_number, password = None, **extra_fields):
if not phone_number: # if condition for if not enter the phone number .
raise ValueError("Phone Number Is Required")

extra_fields['email'] = extra_fields['email'] #pass the extra field


 NOW NORMALIZE THE EXTRA FIELD, FOR THAT WE CAN ADD NORMALIZE MATHOD IN EMAIL.
 extra_fields['email'] = self.normalize_email(extra_fields['email']) #pass the extra field
 NOW SET THE PASSWORD BELOW EXTRA FIELD.
 user = self.model(phone_number = phone_number, **extra_fields) #generate the password
user.set_password(password) # for encrypt the password
user.save(using = self.db)
return user
 NOW THAT SAME WAY CREATE A SUPERUSER BUT WE CAN DEFAULT THE SOME VALUES IN THAT.
 def create_superuser(self, phone_number, password = None, **extra_fields):
# if we can true that field than django can understand that it is a superuser feild
extra_fields.setdefault('is_staff', True)
extra_fields.setdefault('is_superuser', True)
extra_fields.setdefault('is_active', True)
return self.create_user(phone_number, password, **extra_fields)

 NOW ADD THE FIELD IN SETTINGS.PY FILE.


 AUTH_USER_MODEL = 'account.CustomUser'
 NOW DELETE THE DATABASE FILE “DB.SQLITE”.
 IMPORT THE GET_USER_MODEL IN VIEW, MODEL PYTHON FILE.
 from django.contrib.auth import get_user_model
 ADD THE CODE BELOW THAT.
 User = get_user_model()
 NOW ADD THE METHOD IN MODELS FILE.
 from .manager import UserManager
 objects = UserManager()
 NOW MIGRATE THE FUNCTION & CREATESUPERUSER.
 NOW RUNSERVER & U CAN CHECK DJANGO ASKED MOBILE NO. FOR LOGIN.
15. Object/Model Manager
 WHAT IS OBJECT MANAGER?
 WHEN U FIRE A QUERY THAN THAT POINT THE DATABASE. EX., Receipes.objects.create
 WHEN WE CREATE A ENTERPRISE LEVEL SOFTWARE & THEY HAVE A MORE DATA LIKE 1 LAC, THEN
WE CAN USE THE SOFT DELETE FUNCTION IN DJANGO.
 is_deleted = models.BooleanField(default = False)
 NOW CHANGE THE ALL OBJECTS WE CAN CREATE A MODEL MANAGER IN MODELS FILE.
 class StudentsManager(models.Manager):
def get_queryset(self):
return super().get_queryset().filter(is_deleted = False)
 SWAP THE MODEL MANAGER IN STUDENTS CLASS.
 objects = StudentsManager()
admin_manager = models.Manager()
 NOW RUN THE QUERY IN SHELL FOR DELETE DATA & RECOVER THAT DATA USING admin_manager.
 We delete some data using is_deleted in for query.
 from veg.models import *
 Student.objects.all()[1:10]
 for s in Student.objects.all()[1:10]:
 s.is_deleted = True
 s.save()
 Now we return the data using admin object
 Student.admin_objects.all().count()

16. Send Email In Django


 FOR SENDING THE EMAIL WE CAN ADD SOME SETTING IN SETTINGS.PY FILE.
 EMAIL_BACKEND = "django.core.mail.backends.smtp.EmailBackend"
 EMAIL_HOST = "smtop.gmail.com" # which email host u can use
 EMAIL_USER_TILS = True
 EMAIL_PORT = 587 # which port use
 EMAIL_HOST_USER = "" # ur gmail that u want to send mail
 EMAIL_HOST_PASSWORD = "" # and their password
 NOW CREATE A NEW FILE NAMED “utils.py”. IMPORT THE SEND MAIL CLASS.
 from veg.models import Student
import time
from django.core.mail import send_mail
def send_email_to_client():
subject = ""
message = ""
send_mail()
 NOW IMPORT THE SETTINGS IN DJANGO CONF.
 from django.conf import settings
def send_email_to_client():
subject = "This email from django"
message = "This is a students marks message from the institute"
from_email = settings.EMAIL_HOST_USER
recipient_list = ["jayjoshi2784@gmail.com"]
send_mail(subject , message , from_email , recipient_list)
try:
send_mail(subject, message, from_email, recipient_list)
print("Email sent successfully!")
# You can also handle success or any further logic here
except Exception as e:
print(f"An error occurred: {e}")
# Handle the exception/error here if needed
 NOW ADD THE EMAIL BUTTON IN STUDENT.HTML FILE.
 <div class="container mt-5">
<div class="container">
<h4>Here, Sent Email</h4>
<a href="" class="btn btn-success">Send Email</a>
</div>
 NOW ADD THE EMAIL IN VIEW PAGE.
 def send_email(request):
send_email_to_client()
return render(request, 'students.html')
 ADD THE URL IN URLS PAGE.
 path('send-email/', send_email, name='send_email'),
 NOW GO TO WEBSITE & CLICK ON SEND MAIL & SEE UR RECIPIENT EMAIL, EMAIL HAS TO BE
DELIVERED.
 SEND THE EMAIL USING ATTACHMENT.
 IMPORT THE EMAILMESSAGE & ADD CODE IN UTILS.PY FILES.
 from django.core.mail import send_mail, EmailMessage
 def send_email_with_attachment(subject , message, recipient_list , file_path):
mail = EmailMessage(subject = subject , body = message ,
from_email = settings.EMAIL_HOST_USER ,
to = recipient_list
)
mail.attach_file(file_path)
mail.send()
 ADD THE CODE FOR ATTACHMENT IN VIEWS.PY FILE.
 from .utils import send_email_to_client , send_email_with_attachment
 def send_email(request):
message = "check this file immidiatlly"
recipient_list = ["jayjoshi2784@gmail.com"]
file_path = f"{settings.BASE_DIR}/main.xlsx"
send_email_with_attachment(subject , message , recipient_list , file_path)
send_email_to_client()
return HttpResponse(request , "Email Sent Sucessfully")
17. Signals In Django
 WHAT IS API?
 API stands for Application Programming Interface. It's a software intermediary that allows
two applications to communicate with each other. APIs are a way to extract and share data
within and across organizations.
 WHAT IS SIGNALS?
 It means if the create any object then automatically triggerd that function.
 Signals are 4 types.
1. Pre save : If u want to call any activity before the insert database.
2. Post save : If all objects are create after that any activity.
3. Pre delete : If u delete any object but u want to create backup.
4. Post delete : If u delete any object but u want to create backup.
 FOR CALL THE SIGNALS WE CAN IMPORT SOME ITEMS IN MODELS FILE.[Link]
 from django.db.models.signals import post_save
from django.dispatch import receiver
def call_car_api(sender , instance , **kwargs):
print("CAR OBJECT CREATED")
print(sender , instance , kwargs)
 NOW ADD THE CAR OBJECTS IN VIEW.PY FILE.
 Car.objects.create(car_name = f"Nexon - {random.randint(0 , 100)}")
18. Final Project
 CREATE A FINAL FOOD ORDERING PROJECT FROM WHAT WE HAVE LEARNED

You might also like