🛠️ Day 4, 5: Django Admin & Model Relationships – Beginner’s Web Dev Series

Welcome to Day 5 of the Django for Beginners series!
Yesterday, we created a website with basic template inheritance and fetched static data through views. Today, we’ll explore how to manage data visually using the Django Admin Panel, how to connect data using model relationships like ForeignKey
and how to query using Django ORM .
📍 What You’ll Learn
How to use the Django Admin Panel
How to create and use a superuser
How to register and customize models in admin
How to use ForeignKey,
ManyToMany
, andOneToOne
relationshipsHow to query data and display
1. Creating a Superuser
To access the admin panel, create a superuser:
python manage.py createsuperuser
You'll be asked for a username, email, and password.
Run the server:
python manage.py runserver
Then visit:
👉 http://127.0.0.1:8000/admin/
Log in with your new superuser credentials.
2. Registering Models in Admin
In your models.py
(e.g., for a library app):
from django.db import models
# models.py
class Workshop(models.Model):
title = models.CharField(max_length=200)
description = models.TextField(blank=True)
start_date = models.DateField()
location = models.CharField(max_length=100)
created_at = models.DateTimeField(auto_now_add=True)
def __str__(self):
return self.title
class Member(models.Model):
name = models.CharField(max_length=100)
email = models.EmailField(unique=True)
phone = models.CharField(max_length=15, blank=True)
joined_at = models.DateTimeField(auto_now_add=True)
workshops = models.ManyToManyField(Workshop, blank=True)
def __str__(self):
return self.name
Now, register them in admin.py
:
from django.contrib import admin
from .models import Workshop, Member
@admin.register(Workshop)
class WorkshopAdmin(admin.ModelAdmin):
list_display = ('title', 'start_date', 'location', 'created_at')
list_filter = ('start_date', 'location')
search_fields = ('title', 'description')
ordering = ('-start_date',)
@admin.register(Member)
class MemberAdmin(admin.ModelAdmin):
list_display = ('name', 'email', 'phone', 'joined_at')
list_filter = ('joined_at',)
search_fields = ('name', 'email', 'phone')
ordering = ('name',)
3. Understanding Model Relationships
ForeignKey
(Many-to-One)
A post belongs to one workshop, but a workshop can have many posts.
OneToOneField
Each user has exactly one profile, and each profile belongs to exactly one user.
ManyToManyField
Members can join multiple workshops, and each workshop can have multiple members.
4. Setup: Views
from django.shortcuts import render, get_object_or_404
from .models import Workshop, Member
def workshop_list(request):
workshops = Workshop.objects.all().order_by('-date')
return render(request, 'workshop/workshop_list.html', {'workshops': workshops})
def member_list(request):
members = Member.objects.all().order_by('name')
return render(request, 'workshop/member_list.html', {'members': members})
def workshop_detail(request, workshop_id):
workshop = get_object_or_404(Workshop, id=workshop_id)
members = workshop.members.all()
return render(request, 'workshop/workshop_detail.html', {
'workshop': workshop,
'members': members,
})
def member_detail(request, member_id):
member = get_object_or_404(Member, id=member_id)
workshops = member.workshops.all()
return render(request, 'workshop/member_detail.html', {
'member': member,
'workshops': workshops,
})
5. Setup: URLs
URL | View | Purpose |
/workshops/ | workshop_list | List all workshops |
/members/ | member_list | List all members |
/workshops/<id>/ | workshop_detail | Show single workshop + members |
/members/<id>/ | member_detail | Show single member + their workshops |
from django.urls import path
from . import views
urlpatterns = [
path('workshops/', views.workshop_list, name='workshop_list'),
path('workshops/<int:workshop_id>/', views.workshop_detail, name='workshop_detail'),
path('members/', views.member_list, name='member_list'),
path('members/<int:member_id>/', views.member_detail, name='member_detail'),
]
6. Setup: Templates
workshop_list.html
<h1>Workshops</h1>
<ul>
{% for workshop in workshops %}
<li><a href="{% url 'workshop_detail' workshop.id %}">{{ workshop.title }} ({{ workshop.date }})</a></li>
{% empty %}
<li>No workshops available.</li>
{% endfor %}
</ul>
member_list.html
<h1>Members</h1>
<ul>
{% for member in members %}
<li><a href="{% url 'member_detail' member.id %}">{{ member.name }}</a></li>
{% empty %}
<li>No members found.</li>
{% endfor %}
</ul>
workshop_detail.html
<h1>{{ workshop.title }}</h1>
<p>{{ workshop.description }}</p>
<p>Date: {{ workshop.date }} | Location: {{ workshop.location }}</p>
<h2>Members Attending</h2>
<ul>
{% for member in members %}
<li>{{ member.name }}</li>
{% empty %}
<li>No members yet.</li>
{% endfor %}
</ul>
member_detail.html
<h1>{{ member.name }}</h1>
<p>Email: {{ member.email }}</p>
<p>Phone: {{ member.phone }}</p>
<h2>Workshops Attended</h2>
<ul>
{% for workshop in workshops %}
<li>{{ workshop.title }} on {{ workshop.start_date }}</li>
{% empty %}
<li>This member hasn’t joined any workshops yet.</li>
{% endfor %}
</ul>
âś… Task for Day 5
Create a Django app called
library
Create
Author
andBook
models with aForeignKey
relationshipRegister them in the admin panel
Create a superuser and log into the admin
Add at least 2 authors and 3 books using the admin interface
Display book and author list using Django shell or basic template
🚀 What’s Next?
In Day 6, we’ll:
Learn about Django Forms
Create a feedback form
Handle user input and validation
Subscribe to my newsletter
Read articles from Shankar Lamichhane directly inside your inbox. Subscribe to the newsletter, and don't miss out.
Written by

Shankar Lamichhane
Shankar Lamichhane
Hi, I’m Shankar — a Sr. Software Engineer specializing in Python, Django, and DevOps. I build scalable web applications, APIs, and cloud-native systems, with a focus on clean architecture and backend automation.