# 🛠️ 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:

```bash
python manage.py createsuperuser
```

You'll be asked for a username, email, and password.

Run the server:

```bash
python manage.py runserver
```

Then visit:  
👉 [`http://127.0.0.1:8000/admin/`  
Log](http://127.0.0.1:8000/admin/￼Log) in with your new superuser credentials.

---

## 2\. Registering Models in Admin

In your [`models.py`](http://models.py) (e.g., for a library app):

```python
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`](http://admin.py):

```python
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

```python
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 |

```python
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`

```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`

```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`

```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`

```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
