🛠️ 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, and OneToOne relationships

  • How 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

URLViewPurpose
/workshops/workshop_listList all workshops
/members/member_listList all members
/workshops/<id>/workshop_detailShow single workshop + members
/members/<id>/member_detailShow 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

  1. Create a Django app called library

  2. Create Author and Book models with a ForeignKey relationship

  3. Register them in the admin panel

  4. Create a superuser and log into the admin

  5. Add at least 2 authors and 3 books using the admin interface

  6. 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

1
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.