django

 




User: আমি একেবারে নতুন windows 10 use করি। এখন আমি আমার F folder এ mydjango নামে একটা ফোল্ডার খুলে তার ভিতরে django-website নামে একটা ফোল্ডার খুলে এর ভিতরে সব করবে তোমার মত করে Django শিখাও খুব সহজ করে কোড বাই কোড ব্যাখ্যা করবে কোন কোডের কারনে কি আউটপুট এসেছে তা অবশ্যই বলবে সাথে অবশ্যই আউটপুট দেখাবে, আমি কিন্তু কিভাবে powershell or cmd দিয়ে f drive and folder এ ঢুকে সেটা ও জানিনা । আমার django website e থাকবে তিনটি পেইজ home,news,contact. পেইজগুলোর কনটেন্ট তোমার মত করে দিও।

use.ai: নিচে ধাপে ধাপে সব দেওয়া হলো। প্রতিটা কমান্ড হুবহু কপি করে চালাবেন, এবং প্রতিটার পরে যে আউটপুট দেখানো হয়েছে সেটার সাথে আপনার স্ক্রিনের আউটপুট মিলিয়ে নেবেন। মিলে গেলেই পরের ধাপে যাবেন।

ধাপ ০ — Python আছে কিনা দেখা

Django চলে Python এর উপর। তাই আগে Python লাগবে।

PowerShell খোলার নিয়ম: কীবোর্ডে Windows বাটন চাপুন → লিখুন powershell → Windows PowerShell এ ক্লিক করুন। একটা নীল/কালো উইন্ডো খুলবে, ভিতরে লেখা থাকবে PS C:\Users\YourName>। এই লেখাটাকে বলে prompt — মানে "কমান্ড লিখুন"।

এখন লিখুন:

python --version

আউটপুট (ঠিক থাকলে):

Python 3.14.0

ব্যাখ্যা: --version মানে "তোমার ভার্সন বলো"। Python নিজের ভার্সন নম্বর ছাপিয়ে দিল — মানে Python ইনস্টল করা আছে।

যদি এর বদলে Microsoft Store খুলে যায় বা লেখা আসে Python was not found — তার মানে Python নেই। তখন python.org/downloads এ গিয়ে Windows installer নামান, চালানোর সময় নিচের Add python.exe to PATH বক্সে অবশ্যই টিক দেবেন, তারপর PowerShell বন্ধ করে আবার খুলে উপরের কমান্ডটা দেবেন।

ধাপ ১ — F ড্রাইভে ঢোকা ও ফোল্ডার বানানো

এখন PowerShell আছে C:\Users\YourName এ। আমাদের যেতে হবে F ড্রাইভে।

F:

আউটপুট:

PS F:\>

ব্যাখ্যা: শুধু ড্রাইভের নাম আর কোলন (F:) লিখলে PowerShell সেই ড্রাইভে চলে যায়। prompt এর লেখা বদলে PS F:\> হয়ে গেল — এটাই প্রমাণ যে আপনি এখন F ড্রাইভে আছেন। (\> মানে ড্রাইভের একদম মূল/root জায়গায় আছেন।)

এবার mydjango ফোল্ডার বানাই:

mkdir mydjango

আউটপুট:

    Directory: F:\
Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
d-----        30/08/2026   9:12 PM                mydjango

ব্যাখ্যা: mkdir = make directory (ফোল্ডার বানাও)। আউটপুটে d----- এর d মানে directory — অর্থাৎ ফোল্ডারটা সত্যিই তৈরি হয়েছে। এখন File Explorer এ F ড্রাইভ খুললে mydjango দেখতে পাবেন।

ফোল্ডারের ভিতরে ঢুকি:

cd mydjango

আউটপুট:

PS F:\mydjango>

ব্যাখ্যা: cd = change directory (ফোল্ডার বদলাও)। prompt এ এখন F:\mydjango দেখাচ্ছে — মানে আপনি ভিতরে ঢুকে পড়েছেন। prompt এর লেখাটাই আপনার ঠিকানা — সবসময় এটা দেখে বুঝবেন আপনি কোথায় আছেন।

এখন ভিতরে দ্বিতীয় ফোল্ডার বানিয়ে তার ভিতরেও ঢুকি:

mkdir django-website
cd django-website

আউটপুট:

    Directory: F:\mydjango
Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
d-----        30/08/2026   9:13 PM                django-website
PS F:\mydjango\django-website>

চমৎকার। এখন থেকে সব কাজ এই F:\mydjango\django-website ফোল্ডারের ভিতরেই হবে।

💡 পরে আবার কাজ শুরু করার সময় নতুন PowerShell খুলে শুধু দুটো লাইন দেবেন:

F:
cd \mydjango\django-website

ধাপ ২ — Virtual Environment (আলাদা ঘর) বানানো

কেন দরকার: Django সরাসরি পুরো কম্পিউটারে ইনস্টল করলে ভবিষ্যতে অন্য প্রজেক্টের সাথে ভার্সন নিয়ে ঝামেলা হয়। তাই প্রতিটা প্রজেক্টের জন্য একটা আলাদা ছোট ঘর বানানো হয়, যেখানে শুধু সেই প্রজেক্টের জিনিসপত্র থাকে। এটাই virtual environment।

python -m venv venv

আউটপুট:

PS F:\mydjango\django-website>

ব্যাখ্যা: কোনো আউটপুট আসেনি! ভয় পাবেন না — PowerShell এ "কিছু না বলা" মানে "কাজ সফল হয়েছে"। ভুল হলে লাল লেখা আসত। এই কমান্ডে -m venv মানে "venv টুলটা চালাও", আর শেষের venv হলো যে ফোল্ডারটা বানানো হবে তার নাম। এখন আপনার ফোল্ডারে একটা venv নামের ফোল্ডার তৈরি হয়েছে।

দেখে নিন:

dir

আউটপুট:

    Directory: F:\mydjango\django-website
Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
d-----        30/08/2026   9:15 PM                venv

ব্যাখ্যা: dir মানে "এই ফোল্ডারে কী কী আছে দেখাও"। venv ফোল্ডারটা আছে — ঠিক আছে।

এবার ঘরটা চালু (activate) করতে হবে:

.\venv\Scripts\Activate.ps1

আউটপুট:

(venv) PS F:\mydjango\django-website>

ব্যাখ্যা: prompt এর একদম শুরুতে (venv) লেখা যোগ হয়েছে — এটাই সবচেয়ে গুরুত্বপূর্ণ চিহ্ন। (venv) দেখা মানে আপনি এখন আলাদা ঘরের ভিতরে আছেন, এখন যা ইনস্টল করবেন তা শুধু এই প্রজেক্টেই থাকবে।

⚠️ যদি লাল লেখা আসে ... cannot be loaded because running scripts is disabled on this system — এটা Windows এর নিরাপত্তা বাধা। ঠিক করতে একবার এই কমান্ডটা দিন, তারপর আবার activate করুন:

Set-ExecutionPolicy -Scope Process -ExecutionPolicy Bypass

-Scope Process মানে এই ছাড়টা শুধু বর্তমান উইন্ডোর জন্য, উইন্ডো বন্ধ করলেই আগের অবস্থায় ফিরে যাবে — তাই এটা নিরাপদ।

ধাপ ৩ — Django ইনস্টল করা

pip install django

আউটপুট:

Collecting django
  Downloading django-6.1-py3-none-any.whl (8.3 MB)
     ---------------------------------------- 8.3/8.3 MB 3.1 MB/s eta 0:00:00
Collecting asgiref>=3.9.1
  Downloading asgiref-3.9.2-py3-none-any.whl (24 kB)
Collecting sqlparse>=0.3.1
  Downloading sqlparse-0.5.3-py3-none-any.whl (44 kB)
Collecting tzdata
  Downloading tzdata-2026.1-py2.py3-none-any.whl (347 kB)
Installing collected packages: tzdata, sqlparse, asgiref, django
Successfully installed asgiref-3.9.2 django-6.1 sqlparse-0.5.3 tzdata-2026.1

ব্যাখ্যা: pip হলো Python এর দোকান — ইন্টারনেট থেকে প্যাকেজ নামিয়ে ইনস্টল করে। Collecting = নামাচ্ছে, Installing = বসাচ্ছে, আর শেষ লাইনের Successfully installed = কাজ শেষ। Django একা আসেনি, সাথে তার তিনটা সহকারী (asgiref, sqlparse, tzdata) ও এসেছে — এগুলো Django নিজেই ব্যবহার করে, আপনার কিছু করতে হবে না। এই মুহূর্তে সর্বশেষ সংস্করণ Django 6.1। djangoproject.com

মিলিয়ে দেখুন:

django-admin --version

আউটপুট:

6.1

ব্যাখ্যা: django-admin নামের নতুন একটা কমান্ড এখন কাজ করছে — মানে Django ঠিকভাবে বসেছে।

ধাপ ৪ — Django প্রজেক্ট তৈরি

django-admin startproject mysite .

আউটপুট:

(venv) PS F:\mydjango\django-website>

ব্যাখ্যা: আবারও কোনো আউটপুট নেই = সফল। এখানে দুটো জিনিস খেয়াল করুন:

  • mysite হলো প্রজেক্টের নাম। এখানে হাইফেন - বা স্পেস দেওয়া যায় না (তাই django-website নাম প্রজেক্টে ব্যবহার করা যেত না — ওটা শুধু ফোল্ডারের নাম হিসেবে ঠিক আছে)।
  • শেষের ডট . মানে "এখানেই বানাও, নতুন করে আরেকটা ফোল্ডার বানিও না"। ডট না দিলে ফোল্ডারের ভিতরে আরেকটা ফোল্ডার হয়ে অযথা জটিল হতো।

কী কী তৈরি হলো দেখি:

dir

আউটপুট:

    Directory: F:\mydjango\django-website
Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
d-----        30/08/2026   9:20 PM                mysite
d-----        30/08/2026   9:15 PM                venv
-a----        30/08/2026   9:20 PM            686 manage.py

ব্যাখ্যা: দুটো নতুন জিনিস এলো —

  • manage.py — আপনার প্রজেক্টের রিমোট কন্ট্রোল। সার্ভার চালু করা, ডাটাবেস আপডেট করা, সব এটা দিয়ে হয়। (-a---- এর a মানে এটা ফাইল, ফোল্ডার নয়।)
  • mysite — প্রজেক্টের মগজ, ভিতরে সেটিংস আর ঠিকানার তালিকা থাকে।

ধাপ ৫ — প্রথমবার সার্ভার চালানো

python manage.py runserver

আউটপুট:

Watching for file changes with StatReloader
Performing system checks...
System check identified no issues (0 silenced).
You have 18 unapplied migration(s). Your project may not work properly until you apply the migrations for app(s): admin, auth, contenttypes, sessions.
Run 'python manage.py migrate' to apply them.
August 30, 2026 - 21:22:10
Django version 6.1, using settings 'mysite.settings'
Starting development server at http://127.0.0.1:8000/
Quit the server with CTRL-BREAK.

লাইন ধরে ব্যাখ্যা:

  • Watching for file changes — আপনি কোড বদলালেই সার্ভার নিজে থেকে রিস্টার্ট নেবে। বারবার বন্ধ করে চালু করতে হবে না।
  • System check identified no issues — কোডে কোনো ভুল নেই।
  • You have 18 unapplied migration(s) — এটা ভুল নয়, শুধু মনে করিয়ে দেওয়া। Django এর নিজের কিছু টেবিল ডাটাবেসে এখনো বসানো হয়নি। পরের ধাপে ঠিক করব।
  • Starting development server at http://127.0.0.1:8000/ — এটাই আপনার ওয়েবসাইটের ঠিকানা। 127.0.0.1 মানে "এই কম্পিউটার নিজেই"।

এবার ব্রাউজার (Chrome/Edge) খুলে অ্যাড্রেস বারে লিখুন 127.0.0.1:8000 এবং Enter চাপুন।

ব্রাউজারে যা দেখবেন: একটা সবুজ রকেটের ছবি, উপরে লেখা "The install worked successfully! Congratulations!" আর নিচে "You are seeing this page because DEBUG=True is in your settings file and you have not configured any URLs."

🎉 আপনার প্রথম Django সাইট চলছে। এই বার্তার মানে — Django ঠিকঠাক কাজ করছে, কিন্তু আপনি এখনো কোনো পেজ বানাননি।

সার্ভার বন্ধ করতে PowerShell উইন্ডোতে ক্লিক করে Ctrl + C চাপুন। prompt ফিরে আসবে।

ধাপ ৬ — ডাটাবেস প্রস্তুত করা

python manage.py migrate

আউটপুট:

Operations to perform:
  Apply all migrations: admin, auth, contenttypes, sessions
Running migrations:
  Applying contenttypes.0001_initial... OK
  Applying auth.0001_initial... OK
  Applying admin.0001_initial... OK
  Applying admin.0002_logentry_remove_auto_add... OK
  Applying sessions.0001_initial... OK

ব্যাখ্যা: প্রতিটা লাইনের শেষে OK মানে সেই টেবিলটা ডাটাবেসে বসে গেছে। এখন ফোল্ডারে db.sqlite3 নামে একটা নতুন ফাইল তৈরি হয়েছে — এটাই আপনার ডাটাবেস। এখন সার্ভার চালালে আর ওই ১৮টা migration এর সতর্কবার্তা আসবে না।

ধাপ ৭ — কোড লেখার জন্য এডিটর

Notepad দিয়েও হয়, কিন্তু কষ্ট হবে। VS Code নামান (code.visualstudio.com) — ফ্রি এবং সবাই এটাই ব্যবহার করে।

ইনস্টল করার পর PowerShell এ (venv চালু অবস্থায়) লিখুন:

code .

VS Code খুলে যাবে এবং বাঁ পাশে আপনার পুরো ফোল্ডারের ফাইলগুলো দেখাবে। ফাইলে ক্লিক করলেই সম্পাদনা করতে পারবেন, Ctrl + S দিয়ে সেভ করবেন।

কমান্ডটা কাজ না করলে সমস্যা নেই — VS Code নিজে খুলে File → Open Folder → F:\mydjango\django-website সিলেক্ট করুন।

ধাপ ৮ — App তৈরি (pages)

Django তে প্রজেক্ট হলো পুরো বাড়ি, আর app হলো ঘর। আমাদের তিনটা পেজের জন্য একটা ঘর বানাই।

সার্ভার বন্ধ থাকলে PowerShell এ লিখুন:

python manage.py startapp pages

আউটপুট: কিছুই না = সফল। pages নামে নতুন ফোল্ডার তৈরি হলো, যার ভিতরে views.py, models.py, admin.py ইত্যাদি ফাইল আছে।

ধাপ ৯ — settings.py এ তিনটা পরিবর্তন

VS Code এ mysite ফোল্ডার খুলে settings.py ফাইলে ক্লিক করুন। তিন জায়গায় বদল করতে হবে।

পরিবর্তন ১ — নতুন app টাকে পরিচয় করিয়ে দিন। INSTALLED_APPS লেখা তালিকাটা খুঁজুন, শেষ লাইনের আগে "pages", যোগ করুন:

INSTALLED_APPS = [
    "django.contrib.admin",
    "django.contrib.auth",
    "django.contrib.contenttypes",
    "django.contrib.sessions",
    "django.contrib.messages",
    "django.contrib.staticfiles",
    "pages",
]

কেন: এই লাইনটা না দিলে Django জানবেই না যে pages নামে কোনো app আছে। কমা , দিতে ভুলবেন না।

পরিবর্তন ২ — HTML ফাইল কোথায় রাখব তা বলে দিন। TEMPLATES অংশে "DIRS": [] খুঁজে বের করে ভিতরে লিখুন:

        "DIRS": [BASE_DIR / "templates"],

কেন: BASE_DIR মানে আপনার django-website ফোল্ডার। এই লাইনের অর্থ — "HTML ফাইলগুলো django-website\templates ফোল্ডারে খুঁজবে"।

পরিবর্তন ৩ — CSS ফাইল কোথায় তা বলে দিন। ফাইলের একদম নিচের দিকে STATIC_URL = "static/" লাইনটা খুঁজুন, তার ঠিক নিচে নতুন লাইন যোগ করুন:

STATIC_URL = "static/"
STATICFILES_DIRS = [BASE_DIR / "static"]

কেন: CSS, ছবি, JavaScript — এসব "static ফাইল"। এই লাইন Django কে বলে দেয় সেগুলো django-website\static ফোল্ডারে আছে।

Ctrl + S দিয়ে সেভ করুন।

ধাপ ১০ — View লেখা (পেজের মগজ)

pages ফোল্ডারের views.py খুলুন। ভিতরের সব মুছে দিয়ে এটা লিখুন:

from django.shortcuts import render
def home(request):
    return render(request, "home.html")
def news(request):
    news_list = [
        {
            "title": "আমাদের ওয়েবসাইট চালু হলো",
            "date": "৩০ আগস্ট, ২০২৬",
            "body": "দীর্ঘ প্রস্তুতির পর আজ আমাদের নতুন ওয়েবসাইটটি সবার জন্য উন্মুক্ত করা হলো।",
        },
        {
            "title": "নতুন প্রশিক্ষণ কোর্স শুরু",
            "date": "২৫ আগস্ট, ২০২৬",
            "body": "আগামী মাস থেকে সম্পূর্ণ বিনামূল্যে অনলাইন প্রোগ্রামিং কোর্স শুরু হচ্ছে।",
        },
        {
            "title": "অফিসের নতুন ঠিকানা",
            "date": "১০ আগস্ট, ২০২৬",
            "body": "আমাদের কার্যালয় এখন থেকে ধানমন্ডি ২৭ নম্বরে স্থানান্তরিত হয়েছে।",
        },
    ]
    return render(request, "news.html", {"news_list": news_list})
def contact(request):
    sent = False
    if request.method == "POST":
        sent = True
    return render(request, "contact.html", {"sent": sent})

লাইন ধরে ব্যাখ্যা:

  • from django.shortcuts import render — render নামের সাহায্যকারীটা আনলাম। এর কাজ: একটা HTML ফাইল নিয়ে ব্রাউজারে পাঠানো।
  • def home(request): — home নামে একটা ফাংশন। ব্রাউজার থেকে কেউ পেজ চাইলে সেই অনুরোধটা request নামে ভিতরে আসে।
  • return render(request, "home.html") — home.html ফাইলটা ব্রাউজারে পাঠাও।
  • news_list = [...] — এটা একটা তালিকা, ভিতরে তিনটা খবর। প্রতিটা খবর একটা ডিকশনারি — "title", "date", "body" নামে তিনটা ঘর আছে।
  • render(request, "news.html", {"news_list": news_list}) — তৃতীয় অংশটা নতুন। এটা হলো context — মানে "HTML ফাইলের জন্য পাঠানো তথ্য"। এখন news.html এর ভিতরে news_list নামে ডাকলেই খবরগুলো পাওয়া যাবে।
  • if request.method == "POST": — ব্যবহারকারী যখন শুধু পেজটা দেখে, তখন method হয় GET। আর ফর্ম পূরণ করে Send চাপলে হয় POST। তাই এই শর্তটা মানে — "যদি কেউ ফর্ম জমা দিয়ে থাকে, তবে sent কে True বানাও"। পরে HTML এ এই sent দেখে ধন্যবাদ বার্তা দেখাব।

ধাপ ১১ — URL ঠিকানা বসানো

ক) app এর নিজস্ব ঠিকানা তালিকা

pages ফোল্ডারে নতুন ফাইল বানান নাম urls.py (VS Code এ pages ফোল্ডারে মাউস রেখে ডান পাশে দেখানো New File আইকনে ক্লিক করুন)। ভিতরে লিখুন:

from django.urls import path
from . import views
urlpatterns = [
    path("", views.home, name="home"),
    path("news/", views.news, name="news"),
    path("contact/", views.contact, name="contact"),
]

ব্যাখ্যা:

  • from . import views — এই ডটটা মানে "একই ফোল্ডার"। অর্থাৎ পাশের views.py ফাইলটা নিয়ে এসো।
  • path("", views.home, name="home") — প্রথম অংশ "" (ফাঁকা) মানে হোমপেজ, অর্থাৎ 127.0.0.1:8000/। কেউ এখানে এলে views.home ফাংশনটা চালাও।
  • path("news/", ...) — 127.0.0.1:8000/news/ এ এলে news ফাংশন চলবে।
  • name="home" — এই ঠিকানার একটা ডাকনাম। HTML এ লিংক বানানোর সময় পুরো ঠিকানা না লিখে শুধু এই নামটা ব্যবহার করব। ভবিষ্যতে ঠিকানা বদলালেও লিংক ভাঙবে না।

খ) প্রজেক্টকে জানানো

mysite ফোল্ডারের urls.py খুলে সব মুছে এটা লিখুন:

from django.contrib import admin
from django.urls import path, include
urlpatterns = [
    path("admin/", admin.site.urls),
    path("", include("pages.urls")),
]

ব্যাখ্যা: include("pages.urls") মানে — "যেকোনো ঠিকানা এলে সেটা pages app এর তালিকায় পাঠিয়ে দাও"। এটাই প্রজেক্ট আর app এর মধ্যে সংযোগ। এই লাইন না দিলে আপনার পেজগুলো কখনোই খুঁজে পাওয়া যাবে না।

ধাপ ১২ — টেমপ্লেট ফোল্ডার তৈরি

PowerShell এ (venv চালু, django-website ফোল্ডারে থেকে):

mkdir templates
mkdir static\css

আউটপুট:

    Directory: F:\mydjango\django-website
Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
d-----        30/08/2026   9:40 PM                templates
    Directory: F:\mydjango\django-website\static
Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
d-----        30/08/2026   9:40 PM                css

ব্যাখ্যা: static\css লিখলে PowerShell আগে static বানায়, তারপর তার ভিতরে css — এক কমান্ডে দুই ধাপ।

ধাপ ১৩ — base.html (সব পেজের কাঠামো)

templates ফোল্ডারে নতুন ফাইল base.html:

{% load static %}
<!DOCTYPE html>
<html lang="bn">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>{% block title %}আমার সাইট{% endblock %}</title>
    <link rel="stylesheet" href="{% static 'css/style.css' %}">
</head>
<body>
    <header>
        <h1>দিগন্ত</h1>
        <nav>
            <a href="{% url 'home' %}">হোম</a>
            <a href="{% url 'news' %}">খবর</a>
            <a href="{% url 'contact' %}">যোগাযোগ</a>
        </nav>
    </header>
    <main>
        {% block content %}{% endblock %}
    </main>
    <footer>
        <p>© ২০২৬ দিগন্ত। সর্বস্বত্ব সংরক্ষিত।</p>
    </footer>
</body>
</html>

ব্যাখ্যা — এই ফাইলটাই সবচেয়ে গুরুত্বপূর্ণ:

তিন পেজেই একই হেডার, মেনু আর ফুটার থাকবে। একই জিনিস তিনবার লেখা বোকামি। তাই কাঠামোটা একবার এখানে লিখে রাখলাম, বাকি পেজগুলো শুধু এটাকে "উত্তরাধিকার" নেবে।

  • {% ... %} — এটা Django এর নিজের ভাষা (template tag), সাধারণ HTML নয়। ব্রাউজারে পাঠানোর আগে Django এগুলো প্রক্রিয়া করে ফেলে।
  • {% load static %} — CSS/ছবির লিংক বানানোর ক্ষমতা চালু করে। ফাইলের একদম প্রথম লাইনে থাকতে হবে।
  • {% static 'css/style.css' %} — এটা রূপান্তরিত হয়ে /static/css/style.css হয়ে যায়। হাতে ঠিকানা লিখলে পরে সমস্যা হয়, তাই এভাবে লেখাই নিয়ম।
  • {% url 'home' %} — মনে আছে urls.py তে name="home" দিয়েছিলাম? সেই নামটা এখানে ব্যবহার করে Django নিজেই ঠিকানা / বানিয়ে দেয়।
  • {% block content %}{% endblock %} — এটা একটা ফাঁকা জায়গা। প্রতিটা পেজ এই জায়গাটা নিজের মতো ভরবে। এটাই মূল জাদু।

ধাপ ১৪ — তিনটি পেজ

home.html

templates ফোল্ডারে home.html:

{% extends "base.html" %}
{% block title %}হোম | দিগন্ত{% endblock %}
{% block content %}
    <h2>স্বাগতম</h2>
    <p>
        দিগন্তে আপনাকে স্বাগতম। আমরা সহজ বাংলায় প্রযুক্তি শেখাই — যেন
        যে কেউ, যেকোনো বয়সে, নিজের গতিতে শিখতে পারেন।
    </p>
    <div class="cards">
        <div class="card">
            <h3>সহজ পাঠ</h3>
            <p>প্রতিটি বিষয় ছোট ছোট ধাপে ভাগ করা, শুরু থেকে শেষ পর্যন্ত।</p>
        </div>
        <div class="card">
            <h3>হাতে-কলমে</h3>
            <p>শুধু তত্ত্ব নয় — প্রতিটি পাঠে নিজে করে দেখার কাজ থাকে।</p>
        </div>
        <div class="card">
            <h3>সবার জন্য উন্মুক্ত</h3>
            <p>আমাদের সব পাঠ সম্পূর্ণ বিনামূল্যে, কোনো নিবন্ধন লাগে না।</p>
        </div>
    </div>
{% endblock %}

ব্যাখ্যা: {% extends "base.html" %} মানে "আমি base.html এর কাঠামো ধার নিলাম"। এটা অবশ্যই ফাইলের প্রথম লাইনে থাকবে। তারপর {% block content %} এর ভিতরে যা লিখেছি, তা গিয়ে বসবে base.html এর ওই ফাঁকা জায়গায়। হেডার-ফুটার আবার লিখতে হয়নি — নিজে থেকেই চলে আসবে।

news.html

{% extends "base.html" %}
{% block title %}খবর | দিগন্ত{% endblock %}
{% block content %}
    <h2>সর্বশেষ খবর</h2>
    {% for item in news_list %}
        <article class="news-item">
            <h3>{{ item.title }}</h3>
            <span class="date">{{ item.date }}</span>
            <p>{{ item.body }}</p>
        </article>
    {% empty %}
        <p>এই মুহূর্তে কোনো খবর নেই।</p>
    {% endfor %}
{% endblock %}

ব্যাখ্যা:

  • {% for item in news_list %} — views.py থেকে পাঠানো তালিকাটা ধরে একটা একটা করে ঘোরে। প্রতিবার একটা খবর item নামে পাওয়া যায়।
  • {{ item.title }} — দুই কোঁকড়া বন্ধনী {{ }} মানে "এই মানটা এখানে ছাপাও"। প্রথম বার এটা হবে "আমাদের ওয়েবসাইট চালু হলো"।
  • {% empty %} — তালিকাটা যদি ফাঁকা থাকে তবে এই অংশটা দেখাবে। ভালো অভ্যাস।
  • {% endfor %} — লুপ এখানে শেষ।

গুরুত্বপূর্ণ পার্থক্য: {% %} দিয়ে কাজ করানো হয় (লুপ, শর্ত), আর {{ }} দিয়ে মান ছাপানো হয়।

ফলাফল: আপনি একবার HTML লিখলেন, কিন্তু ব্রাউজারে তিনটা খবরের বাক্স দেখাবে — কারণ তালিকায় তিনটা আইটেম ছিল। views.py তে চতুর্থ খবর যোগ করলে HTML না ছুঁয়েই চারটা দেখাবে।

contact.html

{% extends "base.html" %}
{% block title %}যোগাযোগ | দিগন্ত{% endblock %}
{% block content %}
    <h2>যোগাযোগ করুন</h2>
    {% if sent %}
        <p class="success">ধন্যবাদ! আপনার বার্তাটি আমরা পেয়েছি।</p>
    {% endif %}
    <p>ঠিকানা: ধানমন্ডি ২৭, ঢাকা ১২০৯</p>
    <p>ইমেইল: hello@digonto.example</p>
    <p>ফোন: ০১৭০০-০০০০০০</p>
    <form method="post">
        {% csrf_token %}
        <input type="text" name="name" placeholder="আপনার নাম" required>
        <input type="email" name="email" placeholder="আপনার ইমেইল" required>
        <textarea name="message" rows="5" placeholder="আপনার বার্তা" required></textarea>
        <button type="submit">পাঠান</button>
    </form>
{% endblock %}

ব্যাখ্যা:

  • {% if sent %} — views.py থেকে sent এসেছিল। প্রথমবার পেজ খুললে এর মান False, তাই ধন্যবাদ বার্তা দেখাবে না। ফর্ম জমা দিলে True হবে, তখন দেখাবে।
  • method="post" — ফর্মের তথ্য গোপনে সার্ভারে পাঠাবে।
  • {% csrf_token %} — এটা বাদ দিলে Django ফর্ম গ্রহণ করবে না, লাল "403 Forbidden" পেজ দেখাবে। এটা একটা নিরাপত্তা চাবি, যা প্রমাণ করে ফর্মটা সত্যিই আপনার সাইট থেকেই এসেছে। POST ফর্মে এটা বাধ্যতামূলক।
  • name="name" — এই নামেই তথ্যটা সার্ভারে পৌঁছায়। (এখন শুধু ধন্যবাদ দেখাচ্ছি; পরে চাইলে request.POST["name"] দিয়ে নামটা পড়তে বা ডাটাবেসে জমাতে পারবেন।)

ধাপ ১৫ — CSS দিয়ে সাজানো

static\css ফোল্ডারে নতুন ফাইল style.css:

* { margin: 0; padding: 0; box-sizing: border-box; }
body {
    font-family: "Segoe UI", "Nirmala UI", sans-serif;
    background: #f4f6f8;
    color: #24292f;
    line-height: 1.7;
}
header {
    background: #0d3b66;
    color: #fff;
    padding: 22px 40px;
}
header h1 { font-size: 26px; margin-bottom: 10px; }
nav a {
    color: #cfe3ff;
    text-decoration: none;
    margin-right: 22px;
    font-weight: 600;
}
nav a:hover { color: #fff; text-decoration: underline; }
main {
    max-width: 860px;
    margin: 36px auto;
    background: #fff;
    padding: 34px;
    border-radius: 10px;
    box-shadow: 0 1px 4px rgba(0,0,0,.08);
}
main h2 { margin-bottom: 16px; color: #0d3b66; }
.cards { display: flex; gap: 18px; margin-top: 26px; flex-wrap: wrap; }
.card {
    flex: 1 1 220px;
    background: #eef4fb;
    padding: 18px;
    border-radius: 8px;
}
.card h3 { color: #0d3b66; margin-bottom: 8px; font-size: 18px; }
.news-item {
    border-left: 4px solid #0d3b66;
    padding: 12px 18px;
    margin-bottom: 20px;
    background: #fafbfc;
}
.date { font-size: 13px; color: #6a737d; }
.success {
    background: #e6f6ec;
    border: 1px solid #34a853;
    color: #14682f;
    padding: 12px;
    border-radius: 6px;
    margin-bottom: 18px;
}
form { margin-top: 22px; display: flex; flex-direction: column; gap: 12px; max-width: 460px; }
input, textarea {
    padding: 11px;
    border: 1px solid #cbd5e0;
    border-radius: 6px;
    font-family: inherit;
    font-size: 15px;
}
button {
    background: #0d3b66;
    color: #fff;
    border: none;
    padding: 12px;
    border-radius: 6px;
    font-size: 15px;
    cursor: pointer;
}
button:hover { background: #14508c; }
footer {
    text-align: center;
    padding: 22px;
    color: #6a737d;
    font-size: 14px;
}

ব্যাখ্যা: CSS বলে দেয় কোন জিনিস দেখতে কেমন হবে। .card এর মতো ডট দিয়ে শুরু নামগুলো HTML এর class="card" এর সাথে মেলে। Nirmala UI হলো Windows এর বাংলা ফন্ট — এটা লেখায় বাংলা অক্ষর সুন্দর দেখাবে।

ধাপ ১৬ — চূড়ান্ত রান

python manage.py runserver

আউটপুট:

Watching for file changes with StatReloader
Performing system checks...
System check identified no issues (0 silenced).
August 30, 2026 - 22:05:41
Django version 6.1, using settings 'mysite.settings'
Starting development server at http://127.0.0.1:8000/
Quit the server with CTRL-BREAK.

লক্ষ্য করুন — migration এর সতর্কবার্তা আর নেই, কারণ ধাপ ৬ এ আমরা সেটা ঠিক করেছি।

এবার ব্রাউজারে যান 127.0.0.1:8000 এ।

যা দেখবেন: গাঢ় নীল হেডারে "দিগন্ত", নিচে তিনটা মেনু লিংক (হোম | খবর | যোগাযোগ), সাদা কার্ডের ভিতরে "স্বাগতম" লেখা আর পাশাপাশি তিনটা হালকা নীল বাক্স। একদম নিচে ফুটার।

মেনু থেকে "খবর" এ ক্লিক করুন → ঠিকানা হবে 127.0.0.1:8000/news/, আর বাঁ পাশে নীল দাগ দেওয়া তিনটা খবর দেখাবে — প্রতিটার শিরোনাম, তারিখ ও বিবরণসহ।

"যোগাযোগ" এ ক্লিক করুন → ঠিকানা, ইমেইল, ফোন আর একটা ফর্ম দেখাবে। ফর্ম পূরণ করে পাঠান চাপুন → পেজটা রিফ্রেশ হয়ে উপরে সবুজ বাক্সে দেখাবে "ধন্যবাদ! আপনার বার্তাটি আমরা পেয়েছি।"

সাথে সাথে PowerShell এ দেখবেন:

[30/Aug/2026 22:06:12] "GET / HTTP/1.1" 200 2314
[30/Aug/2026 22:06:20] "GET /news/ HTTP/1.1" 200 2698
[30/Aug/2026 22:06:31] "GET /contact/ HTTP/1.1" 200 2510
[30/Aug/2026 22:06:49] "POST /contact/ HTTP/1.1" 200 2642

এই লাইনগুলোর মানে: প্রতিটা ক্লিকের হিসাব। GET = পেজ দেখতে চাওয়া, POST = ফর্ম জমা দেওয়া। শেষের 200 হলো সাফল্যের কোড — সব ঠিক আছে। যদি 404 দেখেন মানে ঠিকানা খুঁজে পায়নি, 500 মানে কোডে ভুল আছে।

চূড়ান্ত ফোল্ডার কাঠামো

F:\mydjango\django-website\
├── venv\                 ← আলাদা ঘর (ছোঁবেন না)
├── db.sqlite3            ← ডাটাবেস
├── manage.py             ← রিমোট কন্ট্রোল
├── mysite\
│   ├── settings.py       ← সব সেটিংস
│   └── urls.py           ← প্রধান ঠিকানা তালিকা
├── pages\
│   ├── views.py          ← পেজের মগজ
│   └── urls.py           ← app এর ঠিকানা তালিকা
├── templates\
│   ├── base.html         ← সাধারণ কাঠামো
│   ├── home.html
│   ├── news.html
│   └── contact.html
└── static\
    └── css\
        └── style.css

পুরো প্রক্রিয়াটা একনজরে

কেউ ব্রাউজারে ঠিকানা লিখলে ভিতরে যা ঘটে:

flowchart LR
    A["ব্রাউজার<br/>/news/"] --> B["mysite/urls.py<br/>include দিয়ে পাঠায়"]
    B --> C["pages/urls.py<br/>news/ মিলে গেল"]
    C --> D["views.news()<br/>তালিকা বানায়"]
    D --> E["news.html<br/>+ base.html"]
    E --> F["তৈরি HTML<br/>ব্রাউজারে"]

এই শৃঙ্খলটা মনে রাখলে Django এর ৮০% বোঝা হয়ে গেছে — URL → View → Template।

সাধারণ ভুল ও সমাধান

সমস্যা কারণ ও সমাধান
TemplateDoesNotExist settings.py এর DIRS এ BASE_DIR / "templates" বসেনি, অথবা ফাইলের নামের বানান ভুল
CSS কাজ করছে না base.html এর প্রথম লাইনে {% load static %} নেই, বা STATICFILES_DIRS যোগ করা হয়নি। ব্রাউজারে Ctrl + F5 চেপে রিফ্রেশ দিন
ফর্মে 403 Forbidden ফর্মের ভিতরে {% csrf_token %} লিখতে ভুলে গেছেন
'python' is not recognized Python ইনস্টল হয়নি বা PATH এ যোগ হয়নি
(venv) দেখা যাচ্ছে না Activate করেননি — .\venv\Scripts\Activate.ps1 চালান
Error: That port is already in use আগের সার্ভার চলছে। ওই উইন্ডোতে Ctrl + C, নয়তো python manage.py runserver 8001
পরিবর্তন দেখা যাচ্ছে না ফাইল সেভ করেননি (Ctrl + S)

পরবর্তী স্বাভাবিক ধাপ হলো খবরগুলোকে views.py এর হার্ডকোড তালিকা থেকে সরিয়ে ডাটাবেসে নেওয়া — models.py তে একটা News মডেল বানিয়ে, makemigrations ও migrate চালিয়ে, তারপর Django এর তৈরি Admin প্যানেল থেকে মাউস দিয়ে খবর যোগ-বিয়োগ করা। তখন কোড না ছুঁয়েই ওয়েবসাইট আপডেট করতে পারবেন। বলুন, সেটা ধরিয়ে দিই।

Post a Comment

0 Comments

Post a Comment (0)