Django is known for its clean architecture and “batteries-included” philosophy. At the heart of every Django application are three essential components:
-
Models – define the structure of your data.
-
Views – handle application logic and process requests.
-
Templates – render HTML and display data to the user.
Together, these three layers form Django’s implementation of the MVT (Model-View-Template) pattern. Understanding how they work—and how they interact—is the foundation for building Django apps that are maintainable, scalable, and easy to extend.
In this tutorial, you’ll learn:
-
What Django Models, Views, and Templates are.
-
How each component works with practical examples.
-
How the MVT flow fits together in a real Django project.
-
Best practices to structure your Django code.
We will walk through creating a simple “Articles” app where users can list, view, and add articles. By the end, you’ll have a clear understanding of how data flows from the database → model → view → template.
Project Setup
Before diving into Django’s Models, Views, and Templates, let’s set up a clean environment and create the Django project we’ll use throughout this tutorial.
1. Prerequisites
Make sure you have the following installed:
-
Python 3.10+
-
pip (comes with Python)
-
virtualenv (optional but recommended)
You can verify your versions:
python --version
pip --version
2. Create a Virtual Environment
Using a virtual environment keeps your Django project isolated and avoids dependency conflicts.
python -m venv env
source env/bin/activate # macOS/Linux
env\Scripts\activate # Windows
After activation, your terminal should show (env).
3. Install Django
Install the latest stable version of Django:
pip install django
Verify Django is installed:
python -m django --version
4. Create a New Django Project
Create a project named mysite:
django-admin startproject mysite
Move into the project directory:
cd mysite
Your folder structure now looks like:
mysite/
├── manage.py
└── mysite/
├── __init__.py
├── settings.py
├── urls.py
├── asgi.py
└── wsgi.py
5. Run the Development Server
To ensure everything works:
python manage.py runserver
Open your browser at:
http://127.0.0.1:8000/
You should see Django’s default “Congratulations!” page.
6. Create the Articles App
Django apps are modular components. For this tutorial, create an app named articles:
python manage.py startapp articles
Add the app to INSTALLED_APPS in mysite/settings.py:
INSTALLED_APPS = [
...
'articles',
]
Your project is now ready to implement Models, Views, and Templates in the upcoming sections.

Understanding Django Models + Creating Our First Model
Django Models are the foundation of your application’s data layer. They define the structure of your database tables using simple Python classes. Django then takes care of generating SQL queries, creating tables, and managing relationships—making models one of the most powerful features of the framework.
In this section, we’ll break down what models are, how they work, and create a practical example for our Articles app.
1. What Is a Django Model?
A Django model is a Python class that inherits from django.db.models.Model. Each attribute in the class represents a database column, and Django automatically creates the table schema based on your model definitions.
For example:
from django.db import models
class Example(models.Model):
name = models.CharField(max_length=100)
created_at = models.DateTimeField(auto_now_add=True)
Django turns this into a table with two columns: name and created_at, plus an automatically-added id primary key.
2. How Models Fit Into the MVT Pattern
The flow looks like this:
-
Model → Defines the data structure
-
View → Retrieves data from the model
-
Template → Displays the data to the user
Models are used by views to access the database, and templates render the information returned by the views.
3. Creating the Article Model
Let’s create a simple model for storing articles. Open articles/models.py and add:
from django.db import models
class Article(models.Model):
title = models.CharField(max_length=200)
content = models.TextField()
author = models.CharField(max_length=100)
created_at = models.DateTimeField(auto_now_add=True)
def __str__(self):
return self.title
Field Explanation
-
title– Name of the article -
content– Full article content -
author– Name of the writer -
created_at– Timestamp automatically set on insert -
__str__– Makes admin and shell output readable
4. Activate the Model (Migrations)
Whenever you add or modify models, you need to run migrations:
python manage.py makemigrations
python manage.py migrate
Django will create the corresponding database table (e.g., articles_article).
5. Verifying the Model (Optional)
You can open the Django shell to create a sample article:
python manage.py shell
from articles.models import Article
Article.objects.create(
title="First Article",
content="This is the content of the first article.",
author="Admin"
)
You’ve successfully built your first model!
Understanding Django Views (Function-Based) + Creating Our First View
Django views are the bridge between your models and templates. A view receives HTTP requests, processes data (often using models), and returns an HTTP response—usually HTML rendered from a template.
In this section, you’ll learn how function-based views (FBVs) work and build your first view for the Articles app.
1. What Is a Django View?
A view is a Python function (or class) that:
-
Accepts an HTTP request
-
Performs logic (e.g., querying a model)
-
Returns an HTTP response (HTML, JSON, redirect, etc.)
A simple example:
from django.http import HttpResponse
def hello_world(request):
return HttpResponse("Hello, world!")
2. How Views Fit Into the MVT Pattern
MVT flow:
-
User → URL triggers a specific view
-
View → Model queries or updates data
-
View → Template renders HTML with the data
-
Template → User displays the result
Views are the brain of the operation.
3. Creating Our First View: List of Articles
Let’s create a view to fetch articles from the database and display them in a template.
Open articles/views.py and add:
from django.shortcuts import render
from .models import Article
def article_list(request):
articles = Article.objects.all().order_by('-created_at')
return render(request, 'articles/article_list.html', {'articles': articles})
What this view does:
-
Retrieves all articles from the database
-
Orders them by newest first
-
Passes them to the template
article_list.html
4. Registering the View in URLs
Create a new file articles/urls.py:
from django.urls import path
from . import views
urlpatterns = [
path('', views.article_list, name='article_list'),
]
Now include this app’s URLs in the project’s main mysite/urls.py:
from django.contrib import admin
from django.urls import path, include
urlpatterns = [
path('admin/', admin.site.urls),
path('articles/', include('articles.urls')),
]
Now visiting:
http://127.0.0.1:8000/articles/
will call the article_list view.
5. Testing the View (Optional)
Temporarily modify the view to confirm it works:
def article_list(request):
return HttpResponse("Articles page works!")
If the page loads text, the routing works.
You’ve created a working function-based view! Next, we’ll make it display real data using templates.
Django Templates Explained + Creating the Articles List Template
Django templates define how data is presented to the user. They are HTML files enhanced with template tags and variables, allowing you to dynamically display content returned by your views.
In this section, we’ll explore how Django’s template system works and build our first template to show the list of articles.
1. What Is a Django Template?
A Django template is:
-
A plain HTML file
-
With special template tags, filters, and variables
-
Used to render dynamic content from views
Example:
<h1>{{ title }}</h1>
<p>Published at: {{ created_at|date:"Y-m-d" }}</p>
2. How Templates Fit Into the MVT Pattern
The flow now looks like:
-
Model: Fetch article data
-
View: Pass articles to a template
-
Template: Loop through and display them
Templates should contain minimal logic—only presentation-related rules.
3. Setting Up the Templates Directory
Inside your articles app, create a templates folder:
articles/
├── templates/
│ └── articles/
│ └── article_list.html
└── views.py
Django automatically discovers app-level templates when the app is listed in INSTALLED_APPS.
4. Creating the Articles List Template
Create the file:
articles/templates/articles/article_list.html
Add the following HTML:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Articles</title>
</head>
<body>
<h1>Articles</h1>
{% if articles %}
<ul>
{% for article in articles %}
<li>
<h2>{{ article.title }}</h2>
<p>{{ article.content|truncatewords:20 }}</p>
<small>By {{ article.author }} | {{ article.created_at|date:"M d, Y" }}</small>
</li>
{% endfor %}
</ul>
{% else %}
<p>No articles found.</p>
{% endif %}
</body>
</html>
What this template does:
-
Loops through all
articlespassed by the view -
Shows the title, truncated content, author, and date
-
Displays a fallback message if no data exists
5. Testing the Template
Start the server:
python manage.py runserver
Navigate to:
http://127.0.0.1:8000/articles/
If you have created sample articles in the shell, they will now appear on the page with clean formatting.
6. Using extends and base.html (Optional Best Practice)
Django recommends the use of template inheritance.
You could create a global template:
mysite/templates/base.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>{% block title %}Django App{% endblock %}</title>
</head>
<body>
<header>
<h1>My Django Website</h1>
</header>
{% block content %}{% endblock %}
</body>
</html>
Then update your article_list.html:
{% extends 'base.html' %}
{% block title %}Articles{% endblock %}
{% block content %}
<h2>Articles</h2>
{% for article in articles %}
<div>
<h3>{{ article.title }}</h3>
<p>{{ article.content|truncatewords:20 }}</p>
<small>By {{ article.author }} | {{ article.created_at|date:"M d, Y" }}</small>
</div>
{% endfor %}
{% endblock %}
This keeps your templates clean and DRY.
Adding a Detail View and Template (View a Single Article)
Now that we have a list page showing all articles, the next step is to display a single article when a user clicks on it. This requires:
-
A Detail View to fetch one article
-
A URL pattern with a dynamic parameter
-
A Template to display the article
Let’s build it step by step.
1. Create the Detail View
Open articles/views.py and add:
from django.shortcuts import render, get_object_or_404
from .models import Article
def article_detail(request, pk):
article = get_object_or_404(Article, pk=pk)
return render(request, 'articles/article_detail.html', {'article': article})
What this does:
-
Retrieves a single article using its primary key (
pk) -
Returns a 404 page automatically if not found
-
Renders a template called
article_detail.html
2. Add URL Pattern for the Detail Page
Update articles/urls.py:
from django.urls import path
from . import views
urlpatterns = [
path('', views.article_list, name='article_list'),
path('<int:pk>/', views.article_detail, name='article_detail'),
]
This creates a dynamic URL like:
/articles/1/
/articles/5/
3. Update the Articles List Template (Add Links)
Open articles/templates/articles/article_list.html and wrap each article title with a link:
<h2>
<a href="{% url 'article_detail' article.pk %}">
{{ article.title }}
</a>
</h2>
Now users can click on titles to open the full article.
4. Create the Article Detail Template
Create the file:
articles/templates/articles/article_detail.html
Add:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>{{ article.title }}</title>
</head>
<body>
<h1>{{ article.title }}</h1>
<p>{{ article.content }}</p>
<p><strong>Author:</strong> {{ article.author }}</p>
<p><strong>Published:</strong> {{ article.created_at|date:"M d, Y" }}</p>
<p><a href="{% url 'article_list' %}">← Back to Articles</a></p>
</body>
</html>
5. Testing the Detail Page
Run the server:
python manage.py runserver
Then visit:
http://127.0.0.1:8000/articles/1/
(or another existing article ID)
You should now see the full article rendered on the page.
6. Optional: Using Template Inheritance
If you are using base.html, update your detail template:
{% extends 'base.html' %}
{% block title %}{{ article.title }}{% endblock %}
{% block content %}
<h1>{{ article.title }}</h1>
<p>{{ article.content }}</p>
<p><strong>Author:</strong> {{ article.author }}</p>
<p><strong>Published:</strong> {{ article.created_at|date:"M d, Y" }}</p>
<p><a href="{% url 'article_list' %}">← Back to Articles</a></p>
{% endblock %}
You now have a working article detail page powered by Django’s MVT pattern!
Creating a Form to Add New Articles (Django Forms + View + Template)
So far, we can list and view articles. Now it’s time to let users create new articles using Django Forms — one of Django’s most powerful features.
In this section, you will:
-
Create a Django ModelForm for the Article model
-
Build a view to handle the form
-
Create a template to display the form
-
Add a link from the list page
1. What is Django Form / ModelForm?
A ModelForm automatically generates form fields from a Django model.
It saves time and ensures your form stays consistent with your database schema.
Example:
class ArticleForm(ModelForm):
class Meta:
model = Article
fields = ['title', 'content', 'author']
2. Create the ArticleForm
Open articles/forms.py (create the file if it doesn’t exist):
from django import forms
from .models import Article
class ArticleForm(forms.ModelForm):
class Meta:
model = Article
fields = ['title', 'content', 'author']
3. Create the View to Handle the Form
Open articles/views.py and add:
from django.shortcuts import render, redirect
from .forms import ArticleForm
def article_create(request):
if request.method == 'POST':
form = ArticleForm(request.POST)
if form.is_valid():
form.save()
return redirect('article_list')
else:
form = ArticleForm()
return render(request, 'articles/article_form.html', {'form': form})
View explanation:
-
GET request → show empty form
-
POST request → validate & save data
-
After saving → redirect back to the article list
4. Add URL Pattern for Creating Articles
Open articles/urls.py:
from django.urls import path
from . import views
urlpatterns = [
path('', views.article_list, name='article_list'),
path('add/', views.article_create, name='article_create'),
path('<int:pk>/', views.article_detail, name='article_detail'),
]
Now the form is accessible at:
/articles/add/
5. Create the Article Form Template
Create this file:
articles/templates/articles/article_form.html
{% extends 'base.html' %}
{% block title %}Add New Article{% endblock %}
{% block content %}
<h2>Add New Article</h2>
<form method="POST">
{% csrf_token %}
{{ form.as_p }}
<button type="submit">Save</button>
</form>
<p><a href="{% url 'article_list' %}">← Back to Articles</a></p>
{% endblock %}
What this does:
-
Displays all form fields wrapped in
<p>tags (form.as_p) -
Includes
{% csrf_token %}for security -
Provides a back link
6. Add "Add New Article" Link on List Page
Open article_list.html and add at the top:
<p><a href="{% url 'article_create' %}">+ Add New Article</a></p>
Optional: Wrap it with some styling:
<p>
<a href="{% url 'article_create' %}" style="font-weight: bold;">+ Add New Article</a>
</p>
7. Test the Article Form
Run:
python manage.py runserver
Visit:
http://127.0.0.1:8000/articles/add/
Try adding:
-
Title
-
Content
-
Author
After submitting, you’ll be redirected to the list page and should see the new article.
You have now read, detailed, and created functionality — a mini CRUD system!
Updating and Deleting Articles (Full CRUD)
You now have Create, Read (List + Detail) operations working.
In this section, you’ll complete the CRUD functionality by adding:
-
Update Article
-
Delete Article
Django makes these operations straightforward using forms, views, and simple URL patterns.
1. Updating an Article
To update an article, we will:
-
Load the existing article
-
Pre-fill the form with its data
-
Save changes on form submission
1.1 Create the Update View
Open articles/views.py and add:
def article_update(request, pk):
article = get_object_or_404(Article, pk=pk)
if request.method == 'POST':
form = ArticleForm(request.POST, instance=article)
if form.is_valid():
form.save()
return redirect('article_detail', pk=article.pk)
else:
form = ArticleForm(instance=article)
return render(request, 'articles/article_form.html', {'form': form, 'article': article})
Explanation:
-
instance=article→ pre-fills form fields -
Saving the form updates the existing article instead of creating a new one
-
Redirects to the article’s detail page after updating
1.2 Add URL Pattern for Update
In articles/urls.py:
path('<int:pk>/edit/', views.article_update, name='article_update'),
Now you can visit:
/articles/1/edit/
To update article #1.
1.3 Add "Edit" Link in Detail Page
Open article_detail.html and add:
<p>
<a href="{% url 'article_update' article.pk %}">✎ Edit Article</a>
</p>
2. Deleting an Article
For deletion, we’ll use a confirmation page so users don’t delete by accident.
2.1 Create the Delete View
Add this to articles/views.py:
def article_delete(request, pk):
article = get_object_or_404(Article, pk=pk)
if request.method == 'POST':
article.delete()
return redirect('article_list')
return render(request, 'articles/article_confirm_delete.html', {'article': article})
How it works:
-
GET request → show a confirmation page
-
POST request → delete the article
2.2 Add URL Pattern for Delete
In articles/urls.py:
path('<int:pk>/delete/', views.article_delete, name='article_delete'),
2.3 Create the Delete Confirmation Template
Create:
articles/templates/articles/article_confirm_delete.html
{% extends 'base.html' %}
{% block title %}Delete Article{% endblock %}
{% block content %}
<h2>Delete Article</h2>
<p>Are you sure you want to delete <strong>{{ article.title }}</strong>?</p>
<form method="POST">
{% csrf_token %}
<button type="submit">Yes, delete</button>
</form>
<p><a href="{% url 'article_detail' article.pk %}">Cancel</a></p>
{% endblock %}
2.4 Add Delete Link to Detail Page
Open article_detail.html and add below the Edit link:
<p>
<a href="{% url 'article_delete' article.pk %}">🗑 Delete Article</a>
</p>
3. Test the Full CRUD Workflow
-
Add a new article
-
Go to its detail page
-
Click Edit, update something, save
-
Click Delete, confirm deletion
-
Check that it disappears from the list
You now have a fully functioning CRUD system built with Django’s MVT pattern.
Connecting Models, Views, and Templates — The Full MVT Flow Explained
Now that you’ve built all CRUD features (Create, Read, Update, Delete), it’s time to step back and understand how Django’s MVT structure works as a whole.
Django doesn’t follow the classic MVC pattern — instead, it uses MVT (Model–View–Template), where Django handles the controller part internally.
Below is a visual representation of how a request flows through Django.
1. MVT Flow Diagram


2. Step-by-Step Explanation of the MVT Flow
Let’s break down what actually happens when a user interacts with your application.
Step 1: User Requests a URL (e.g., /articles/)
The flow begins with a browser request:
GET /articles/
Django receives this request and immediately checks your URL configuration (urls.py files) to see which view should handle it.
Step 2: URL Dispatcher Routes to a View
Example from articles/urls.py:
path('', views.article_list, name='article_list'),
Django sees this and calls the article_list function.
Step 3: The View Interacts With the Model
Inside the view:
articles = Article.objects.all()
This line sends a database query through Django’s ORM:
-
Django converts Python methods into SQL
-
Fetches data from the database
-
Returns Python objects (QuerySet)
The view is the place where:
-
Business logic happens
-
Models are queried
-
Data is prepared for display
Step 4: The View Passes Data to a Template
The view calls:
return render(request, 'articles/article_list.html', {'articles': articles})
This does three things:
-
Loads the
article_list.htmltemplate -
Injects the data (
articles) into it -
Returns an HttpResponse containing HTML
Step 5: The Template Renders Dynamic HTML
Inside article_list.html:
{% for article in articles %}
<h2>{{ article.title }}</h2>
{% endfor %}
Django template engine replaces:
-
{{ article.title }}→ actual article titles -
Loops, filters, and template tags are processed
-
Final output is plain HTML
Step 6: Django Returns the Final HTML Response
Django sends the rendered HTML back to the browser:
HTTP 200 OK
Content-Type: text/html
The user sees the fully rendered page.
3. Putting It All Together: Full Request Cycle
Here’s the complete flow:
-
Browser → URL
-
URL → View
-
View → Model (query)
-
Model → Data returned
-
View → Template (context data)
-
Template → Rendered HTML
-
Django → Browser (final response)
This cycle repeats for:
-
Listing articles
-
Viewing a single article
-
Adding a new one
-
Editing an existing one
-
Deleting one
Everything you built follows this exact MVT pattern.
4. Why Django Uses MVT Instead of MVC
Django calls its views “views,” but they behave more like controllers in classic MVC.
Django does the controller work internally:
-
Routing
-
Request parsing
-
Middleware
-
Rendering responses
-
Handling sessions/cookies
This gives you a cleaner structure with less boilerplate.
5. Summary
By now, you’ve seen how all parts connect:
-
Model → Handles database structure & queries
-
View → Orchestrates logic & passes data to templates
-
Template → Displays the user interface
Understanding this flow is essential for mastering Django and building scalable applications.
Best Practices for Models, Views, and Templates (Clean Code, Structure, and Tips)
Building a Django app that works is one thing—but building one that is clean, maintainable, scalable, and easy to understand is the real goal.
This section covers important best practices you should follow when working with Django’s Models, Views, and Templates.
1. Best Practices for Models
Models define the core data structure of your application, so they must be clean and consistent.
✅ 1. Keep Models Small and Focused
Each model should represent one clear concept.
❌ Avoid adding too many unrelated fields in a single model
✔ Split into separate models when needed
✅ 2. Use Descriptive Field Names
Good:
published_at = models.DateTimeField()
Bad:
date = models.DateTimeField()
✅ 3. Use __str__() for Human-Friendly Display
Always include:
def __str__(self):
return self.title
This makes your admin panel, shell, and logs cleaner.
✅ 4. Add Meta Options for Ordering
Define default ordering so views don’t keep repeating it:
class Meta:
ordering = ['-created_at']
✅ 5. Use Related Models & Foreign Keys Properly
Example:
author = models.ForeignKey(User, on_delete=models.CASCADE)
Avoid duplicating data across models.
2. Best Practices for Views
Views should be short, readable, and handle only the necessary logic.
✅ 1. Keep Views Slim
A view should not contain heavy business logic.
If logic grows too big:
-
Move it to a service function
-
Or add helper methods in models
✅ 2. Use get_object_or_404
Instead of:
Article.objects.get(pk=pk)
Use:
article = get_object_or_404(Article, pk=pk)
This prevents crashes and provides a clean 404 response.
✅ 3. Use Django Generic Views for DRY Code (Optional)
Instead of writing these manually:
-
List view
-
Detail view
-
Create view
-
Update view
-
Delete view
You can use Django’s class-based generic views:
from django.views.generic import ListView
But for beginners, manual views help understand the flow better.
✅ 4. Avoid Duplicate Code in Forms
Use a shared form template (like we did with article_form.html) for both create and update.
✔ Less code
✔ Easier to maintain
✅ 5. Redirect After POST (POST/Redirect/GET Pattern)
Never return a template directly after form submission.
Correct:
return redirect('article_list')
Prevents resubmission on page refresh.
3. Best Practices for Templates
Templates should focus only on presentation, not business logic.
✅ 1. Use Template Inheritance
Always create a base.html:
{% block content %}{% endblock %}
Then extend it in all templates:
{% extends 'base.html' %}
Keeps your UI consistent and DRY.
✅ 2. Avoid Complex Logic in Templates
Bad:
{% if article.author == user and article.published_at > now %}
Good:
-
Move logic to views
-
Pass
is_owneroris_publishedfrom view context
✅ 3. Use Template Filters
Filters help format output:
-
{{ date|date:"M d, Y" }} -
{{ content|truncatewords:30 }}
✅ 4. Keep HTML Clean and Organized
-
Use proper headings (
<h1>, <h2>) -
Avoid inline CSS when possible
-
Keep layout consistent
4. Folder Structure Best Practices
A clean Django project usually looks like:
mysite/
├── manage.py
├── templates/
│ └── base.html
├── articles/
│ ├── templates/
│ │ └── articles/
│ │ ├── article_list.html
│ │ ├── article_detail.html
│ │ ├── article_form.html
│ │ └── article_confirm_delete.html
│ ├── forms.py
│ ├── models.py
│ ├── urls.py
│ └── views.py
└── mysite/
├── settings.py
└── urls.py
Everything is clearly separated and easy to navigate.
5. Security Best Practices
✅ Use CSRF Tokens
Always include:
{% csrf_token %}
in POST forms.
✅ Validate Forms Properly
Use ModelForms—they automatically:
-
Validate field types
-
Prevent empty values
-
Sanitize user input
✅ Never Expose Sensitive Data in Templates
Avoid passing internal logic or user permissions directly.
6. Summary
By following these best practices, your Django project will be:
-
Easier to maintain
-
Cleaner and better organized
-
More secure
-
Scalable as your application grows
Models define your data, Views handle logic, and Templates present the results — keeping each layer clean and focused makes your codebase professional and production-ready.
Conclusion
You’ve now walked through the full journey of Django’s Models, Views, and Templates (MVT) architecture by building a complete mini–CRUD application. Along the way, you learned how each layer plays its part:
-
Models define and manage your database structure
-
Views coordinate the logic and handle incoming requests
-
Templates render HTML to present data beautifully
You created:
-
A model to store articles
-
Views to list, display, create, update, and delete articles
-
Templates to show dynamic content
-
URL routes to tie everything together
This structure is what makes Django powerful, clean, and maintainable. Whether you're building blogs, dashboards, APIs, or full-scale web applications, the MVT pattern is the foundation you’ll rely on.
With these fundamentals in place, you’re now ready to explore deeper topics such as:
-
Class-based views (CBVs)
-
Django admin customization
-
Authentication and permissions
-
Static files and media uploads
-
Pagination, forms, middleware, and advanced querysets
Understanding how Models, Views, and Templates connect gives you the confidence to build scalable Django applications the right way.
Well done — you now have a solid grasp of Django’s core architecture and a practical CRUD application to prove it.
You can find the full source code on our GitHub.
That's just the basics. If you need more deep learning about Python, Django, FastAPI, Flask, and related, you can take the following cheap course:
- 100 Days of Code: The Complete Python Pro Bootcamp
- Python Mega Course: Build 20 Real-World Apps and AI Agents
- Python for Data Science and Machine Learning Bootcamp
- Python for Absolute Beginners
- Complete Python With DSA Bootcamp + LEETCODE Exercises
- Python Django - The Practical Guide
- Django Masterclass : Build 9 Real World Django Projects
- Full Stack Web Development with Django 5, TailwindCSS, HTMX
- Django - The Complete Course 2025 (Beginner + Advance + AI)
- Ultimate Guide to FastAPI and Backend Development
- Complete FastAPI masterclass from scratch
- Mastering REST APIs with FastAPI
- REST APIs with Flask and Python in 2025
- Python and Flask Bootcamp: Create Websites using Flask!
- The Ultimate Flask Course
Thanks!
