Django Unfold Admin এ Custom Page তৈরি করার সম্পূর্ণ টিউটোরিয়াল
New Working
Old Tutorials
Unfold Admin Custom Page Tutorial
Django Unfold Admin এ custom page তৈরি করার সহজ ও প্রোডাকশন-ready গাইড।
📁 File Structure
your_project/
├── config/
│ ├── settings.py # UNFOLD config
│ └── urls.py # URL registration
├── your_app/
│ ├── views.py # Custom view
│ └── templates/
│ └── admin/
│ └── your_app/
│ └── my_page.html # Template
Step 1: View তৈরি করো
File: your_app/views.py
from django.contrib import admin
from django.contrib.admin.views.decorators import staff_member_required
from django.shortcuts import render
@staff_member_required
def my_custom_view(request):
"""Custom admin page"""
# IMPORTANT: admin.site.each_context(request) MUST include করতে হবে
# এটা ছাড়া sidebar, topbar কিছুই দেখাবে না!
context = {
**admin.site.each_context(request), # ⭐ REQUIRED
'title': 'My Custom Page',
'subtitle': 'This is my custom admin page',
'items': ['Item 1', 'Item 2', 'Item 3'],
'count': 100,
}
return render(request, 'admin/your_app/my_page.html', context)
🔑 Key Points
@staff_member_required→ শুধু admin/staff users access পাবে**admin.site.each_context(request)→ এটা MUST- Sidebar
- Topbar
- User menu
- Theme layout
👉 এগুলো সব এর উপর depend করে
Step 2: URL Register করো
File: config/urls.py
from django.contrib import admin
from django.urls import path
from your_app.views import my_custom_view
urlpatterns = [
# ⭐ Custom URL অবশ্যই admin/ এর আগে রাখতে হবে
path('admin/my-page/', my_custom_view, name='my-custom-page'),
path('admin/', admin.site.urls),
]
🔑 Key Points
- Custom URL অবশ্যই
admin/এর আগে - URL name (
my-custom-page) sidebar link এর জন্য দরকার
Step 3: Template তৈরি করো
File:your_app/templates/admin/your_app/my_page.html
{% extends "unfold/layouts/base.html" %}
{% load i18n unfold %}
{% block breadcrumbs %}
<div class="breadcrumbs">
<a href="{% url 'admin:index' %}">Home</a>
<span class="separator">›</span>
<span>{{ title }}</span>
</div>
{% endblock %}
{% block content %}
<div class="space-y-6">
<!-- Page Header -->
<div class="mb-6">
<h1 class="text-2xl font-bold text-foreground">{{ title }}</h1>
<p class="text-sm text-muted-foreground">{{ subtitle }}</p>
</div>
<!-- Stats Cards -->
<div class="grid grid-cols-1 md:grid-cols-3 gap-4">
<div class="rounded-xl border bg-card p-6">
<p class="text-sm text-muted-foreground">Total Count</p>
<p class="text-3xl font-bold text-primary">{{ count }}</p>
</div>
</div>
<!-- Data Table -->
<div class="rounded-xl border bg-card overflow-hidden">
<div class="px-5 py-4 border-b">
<h2 class="font-semibold">Items List</h2>
</div>
<div class="p-5">
{% if items %}
<ul class="space-y-2">
{% for item in items %}
<li class="p-3 bg-muted/50 rounded-lg">
{{ item }}
</li>
{% endfor %}
</ul>
{% else %}
<p class="text-muted-foreground text-center py-8">
No items found
</p>
{% endif %}
</div>
</div>
</div>
{% endblock %}
🔑 Key Points
{% extends "unfold/layouts/base.html" %}→ MUST{% load i18n unfold %}→ Unfold template tags- Tailwind CSS fully supported (Unfold default)
Step 4: Sidebar এ Link যোগ করো
File: config/settings.py
from django.urls import reverse_lazy
from django.utils.translation import gettext_lazy as _
UNFOLD = {
"SITE_TITLE": "My Admin Panel",
"SITE_HEADER": "My Administration",
"SIDEBAR": {
"show_search": True,
"show_all_applications": False,
"navigation": [
# Custom Pages
{
"title": _("Custom Pages"),
"separator": True,
"items": [
{
"title": _("My Custom Page"),
"icon": "dashboard",
"link": lambda request: reverse_lazy("my-custom-page"),
},
],
},
# Models
{
"title": _("Management"),
"separator": True,
"items": [
{
"title": _("Users"),
"icon": "person",
"link": lambda request: reverse_lazy(
"admin:auth_user_changelist"
),
},
],
},
],
},
}
🔑 Key Points
- Sidebar link দিতে হবে
lambda request: reverse_lazy("url-name") icon→ Google Material Icons name
📋 Quick Checklist
| Component | Required | Why |
|---|---|---|
admin.site.each_context(request) | ✅ YES | Sidebar, topbar, user menu |
{% extends "unfold/layouts/base.html" %} | ✅ YES | Unfold layout |
{% load unfold %} | ✅ YES | Unfold tags |
@staff_member_required | ✅ YES | Security |
URL before admin/ | ✅ YES | Routing |
| Sidebar navigation | ✅ YES | Visibility |
🎨 Common Tailwind Classes (Unfold)
<!-- Card -->
<div class="rounded-xl border bg-card p-6"></div>
<!-- Muted text -->
<p class="text-muted-foreground"></p>
<!-- Primary color -->
<span class="text-primary"></span>
<!-- Grid -->
<div class="grid grid-cols-1 md:grid-cols-3 gap-4"></div>
<!-- Vertical spacing -->
<div class="space-y-6"></div>
<!-- Badge -->
<span class="inline-flex items-center px-2.5 py-0.5 rounded-full
text-xs font-medium bg-green-100 text-green-800">
Active
</span>
🔗 Material Icons (Sidebar)
dashboard→ Dashboardperson→ Usergroup→ Groupsettings→ Settingsassessment→ Reportsschedule→ Time / Schedulephoto_camera→ Mediatask_alt→ Tasks
👉 Full list:
https://fonts.google.com/icons
✅ Done!
এই ৪টা step follow করলেই:
- ✅ Unfold Admin layout intact থাকবে
- ✅ Sidebar / Topbar কাজ করবে
- ✅ Fully secure (staff only)
- ✅ Production-ready custom page তৈরি হবে
চাও তো আমি এটাকে
- 📘 Blog post
- 📄 PDF guide
- 🧵 Medium article
- 🧩 Reusable boilerplate repo
এগুলোর যেকোনো ফরম্যাটে করে দিতে পারি।