07 Django (Complete Blog Design)

একটা পুর্নাংগ ব্লগ বানানোর স্টেপ সমুহ (Learning Phase)

মূলত যা যা করা হয়-

  • ব্যাসিক কাজকারবার: এনভায়রনমেন্ট সেটাপ & File Structure[Django Project,Apps] Create
  • V::: ব্যাসিককন্টেন্ট(Text) শো করাতে: views.py & urls.py file Config ও
  • M::: ডাটাবেইজ কনফিগারেশন করতে: models.py & admin.py file Config ও Adding Models To The Administration Site
  • এপস ফাইলের কাজগুলো: [settings.py & urls.py] App file Config ও
  • T::: ওয়েবপেজ শো করাতে: Template Files & views.py
একটা পুর্নাংগ ব্লগ বানানোর স্টেপ সমুহ-
  • 1. এনভায়রনমেন্ট সেটাপ
  • ২. সেটিংস ফাইল ও হোম পেজ ইউ আর এল সেটাপ
  • ৩. মডেল তৈরী ( টাইটেল, স্লাগ, কন্টেন্ট )
  • ৪. স্লাগ অটো জেনারেট হওয়া [[[ ]]]]
  • ৫. ক্যাটাগরি মডেল তৈরী ও ফরেন কী সেটাপ (নতুন)
  • ৬. টেমপ্লেট ইনহেরিটেশন
  • ৭. সিংগেল পেজ সেটাপ ডায়নামিক ইউ আর এল
  • ৮. স্টাটিক কন্টেন্ট সেটাপ
  • ৯. মডেলের কন্টেন্ট অংশে ব্লক তৈরী ( h1, h2, p, image, ) ইত্যাদি
  • ১০. সাইডবার সেটাপ
  • ১১. ইউজার যেন ড্যাশবোর্ডে না ঢুকেই ফর্ম এর মাধ্যমে পোষ্ট দিতে পারে সেটা তৈরী
  • ১২. ইউজার লগিন ও রেজিস্ট্রেশন সিস্টেম তৈরী
  • ১৩. এসইও প্লাগিন অংশ ডেভেলপ করা
  • ১৪. অটোমেটেড সাইটম্যাপ তৈরী
আশা করছি এখানে নতুন অনেক কিছু পাবেন । আর ভিডিও গুলাতে-
৩৪. এনভায়রনমেন্ট সেটাপ ঃ
৩৫। বেসিক মডেল তৈরী
৩৬. অটো পপুলেটেড স্লাগ ফিল্ড
৩৭. ফরেন কি, মেনি টু মেনি রিলেশন শীপ নিয়ে ধারনা
৩৮. রিচ টেক্সট এডিটর বা ক্লাসিক এডিটর তৈরী
৩৯ টেমপ্লেট ডাউনলোড
৪০ স্টাটিক ফাইল কনফিগারেশন পার্ট -১
৪১. স্টাটিক ফাইল কনফিগারেশন পার্ট -২
42 Blog Design Part 1
43 Blog Url and Views Config Part 2
44 Blog Design Creating and Planning Model Part 3
45 Blog Design 4 Configuring CK Editor
46 Working with Template File Blog Design 5
47 Working with Views and Template File Blog 6
48 Extending Template File Blog 7
49 Working with Single Post Blog 8
50 Working with Meta Data and Caching System Blog 9
  • Theme Download and analyses:
  • Statics File Configuration1,2:
  • Blog Design Part 1:
  • Blog url & views config:
  • creating & planing model(Blog design):
  • Configuring CK Editor(Blog design):
  • Working with Template file(Blog design):
  • Working with views and template file(Blog design):
  • Extending Template file(Blog design):
  • Working with single post(Blog design):
  • Working with meta data & Caching system(Blog design):
  • After (Complete Blog Design):
  • Check User Logged or Not in Template:
  • Checking authentication with view file:
  • Django login form:
  • Django form:
  • Model form ideas:
  • Django all auth introduction

জ্যাংগোতে মাস্টার হবার জন্য কী কী বিষয় শেখা লাগবে? কোনটার পর কোনটা শিখবেন?

১. পাইথনের বেসিক্স ভালোভাবে জানুন
জ্যাংগো পাইথনের ওপর ভিত্তি করে তৈরি, তাই শুরুতে পাইথনের বেসিক ভালোভাবে জানা জরুরি।
✔️ ডাটা টাইপস (list, dict, tuple)
✔️ লুপ, কন্ডিশনাল স্টেটমেন্ট
✔️ ফাংশন এবং ক্লাস
২. ভার্চুয়াল এনভায়রনমেন্ট তৈরি করা শিখুন
প্রজেক্টের জন্য আলাদা ভার্চুয়াল এনভায়রনমেন্ট সেট আপ করতে হবে।
✔️ pip install virtualenv
✔️ ভার্চুয়াল এনভায়রনমেন্ট তৈরি এবং অ্যাক্টিভ করা শিখুন।
৩. জ্যাংগো ইনস্টল করুন
আপনার ভার্চুয়াল এনভায়রনমেন্টের মধ্যে জ্যাংগো ইনস্টল করুন।
✔️ pip install django
৪. জ্যাংগো প্রজেক্ট তৈরি করা শিখুন
✔️ django-admin startproject projectname
প্রথম প্রজেক্ট তৈরি করুন এবং সেটিংস ফাইল নিয়ে একটু সময় ব্যয় করুন।
৫. অ্যাপ তৈরি করুন
জ্যাংগোতে প্রজেক্টের মধ্যে অ্যাপ তৈরি করা হয়। শিখুন কিভাবে অ্যাপ তৈরি করতে হয়।
✔️ python manage. py startapp appname
৬. ভিউস (Views) এবং ইউআরএলস (URLs) শিখুন
জ্যাংগোতে Views এবং URLs এর মাধ্যমে কীভাবে পেজ তৈরি করা হয় তা শিখুন।
✔️ views. py ফাইল তৈরি করে ফাংশন লিখুন।
✔️ urls. py ফাইল তৈরি করে রুট সেটআপ করুন।
৭. টেম্পলেট এবং স্ট্যাটিক ফাইলস
জ্যাংগোতে HTML টেম্পলেট এবং CSS/JS কিভাবে ইন্টিগ্রেট করবেন তা শিখুন।
✔️ টেম্পলেট ফোল্ডার তৈরি করে HTML ফাইলগুলো রাখুন।
✔️ স্ট্যাটিক ফোল্ডার তৈরি করে CSS/JS ফাইল যুক্ত করুন।
৮. মডেলস (Models) এবং ডাটাবেস
জ্যাংগোর ORM (Object Relational Mapping) এর মাধ্যমে ডাটাবেস মডেল তৈরি করুন।
✔️ মডেল ডিফাইন করা শিখুন।
✔️ python manage. py makemigrations এবং migrate কমান্ড ব্যবহার করে ডাটাবেস আপডেট করুন।
৯. অ্যাডমিন প্যানেল ব্যবহার করুন
জ্যাংগোর বিল্ট-ইন অ্যাডমিন প্যানেল কিভাবে কনফিগার করবেন তা শিখুন।
✔️ admin. py ফাইলে আপনার মডেল রেজিস্টার করুন।
✔️ অ্যাডমিন প্যানেলে ডাটা ম্যানেজ করুন।
১০. ফর্ম হ্যান্ডলিং
ইউজার ইনপুট হ্যান্ডেল করার জন্য Django ফর্ম কিভাবে ব্যবহার করতে হয় শিখুন।
✔️ Django ফর্ম তৈরি করুন এবং ইনপুট ভ্যালিডেশন শিখুন।
১১. বোনাস: API এবং REST Framework
জ্যাংগো রেস্ট ফ্রেমওয়ার্ক (DRF) দিয়ে কিভাবে API তৈরি করতে হয় তা শিখুন।
✔️ pip install djangorestframework
✔️ DRF দিয়ে বেসিক CRUD API তৈরি করুন।

# Virtual Environment তৈরি করা, Django+প্রজেক্ট রান করা, প্রোজেক্ট, অ্যাপস(Blog),ফোল্ডারগুলো তৈরি:::

প্রথমে আমরা template ফোল্ডারের ভেরর Projects নামে আরেকটি ফোল্ডার তৈরি করে নেব।

→ এরপর, Projects ফোল্ডারে থাকা অবস্থায়, gitbash ওপেন করে কমান্ড দেব:

python -m venv env

তাহলে ঐ ফোল্ডারের ভেতর env নামে আরো একটা ফোল্ডার তৈরি হয়ে যাওয়ার মাধ্যমে এনভায়রনমেন্ট তৈরি হয়ে যাবে।

→ এখন, আবার, কমান্ড দেব:

source env/Script/activate

তাহলে এনভায়রনমেন্টটা একটিভ হয়ে যাবে।

→ এখন, কমান্ড দেব:

pip install django

তাহলে django install হয়ে যাবে।

→ এখন, কমান্ড দেব:

django-admin startproject blogproject

তাহলে ঐ ফোল্ডারের ভেতর blogproject নামে একটা ফোল্ডার তৈরি [ও পাশাপাশি static নামে আরো একটি ফোল্ডার, manage.py নামে একটি ফাইল তৈরি] হয়ে যাওয়ার মাধ্যমে একটা প্রজেক্ট তৈরি হয়ে যাবে।

এখন এই প্রজেক্ট এর নাম আমার অভ্যাসমত rename করে src(প্রজেক্ট) করে দেব।

→↓ এখন, কমান্ড দেব:

cd src/

তাহলে src ফোল্ডারে ডুকে যাবে।

→ এখন, কমান্ড দেব:

python manage.py startapp blog

তাহলে ঐ ফোল্ডারের ভেতর blog নামে একটা ফোল্ডার এর পাশাপাশি blogproject, static নামে ফোল্ডারসমুহ ও python.py নামে ফাইল তৈরি হয়ে যাওয়ার মাধ্যমে একটা এপস তৈরি হয়ে যাবে।

এরপর, blogproject>settings.py ফাইলে edit করব:

INSTALLED_APPS লিস্টে শেষে ‘blog’, এপসটা যুক্ত করে নেব অর্থাৎ –

'blog',

এবং

TEMPLATES লিস্টে ‘DIRS’ = [], এর জায়গায় এটার পরিবর্তে (নিচের এটা) যুক্ত করে নেব-

'DIRS' = [BASE_DIR / 'templates'],

→ এখন, src ফোল্ডারে থাকা অবস্থায় পর পর দুইটা কমান্ড দেব:

mkdir templates
mkdir staticfiles

তাহলে src ফোল্ডারের ভেতর template, staticfiles নামে দুইটা ফোল্ডার তৈরি হয়ে যাবে, যা আমরা ls কমান্ড দিয়ে চেক করে নিতে পারব।

এবং, static ফোল্ডার যদি থেকে না থাকে ঐটাও বানিয়ে নেব-

mkdir static

→↓ এখন, কমান্ড দেব:

cd templates/

তাহলে src থেক templates ফোল্ডারের ভেতর ডুকে যাবে।

→ এখন, পর পর দুইটা কমান্ড দেব:

mkdir blog
mkdir partial

তাহলে, templates ফোল্ডারের ভেতর blog, partial নামে দুইটা ফোল্ডার তৈরি হয়ে যাবে।

→ এখন, কমান্ড দেব:

cd ..

তাহলে templates ফোল্ডার থেকে src ফোল্ডারে পুনরায় ব্যাক আসবে(যেখানে manage.py ফাইল আছে)।

ব্যাস, এতটুকুর কাজ হয়ে গেল।

এখন, যাতে খেই হারিয়ে না ফেলি এজন্য MVT format এ পর্যায়ক্রমে কাজগুলো করব।

১মে, V এর কাজ করি-

(Blog) views.py & urls.py Config

এখন, blogproject>urls.py ফাইলে edit করব:

from django.urls import path এর জায়গায় এটার পরিবর্তে যুক্ত করে নেব-

from django.urls import path, include

এবং

urlpatterns লিস্টে শেষে এটা যুক্ত করে নেব-

path('', include('blog.urls')),

এবার, blog>urls.py ফাইলে edit করব (এ ফাইলটা আমরা আগে তৈরি করে নিয়েছিলাম, তৈরি করা না থাকলে তৈরি করে নেব):

from django.urls import path
from . import views
urlpatterns = [
    path('', views.home_view, name='home'), 
]

এখানে, views.home_view যেটা লিখেছি, ঐটা আসলে এখনো তৈরি করা হয়নি, তাই এটা তৈরি করে নিব।

এজন্য এখন, blog>views.py ফাইলে edit করব:

from django,shortcuts import render এই লাইন এর নিচে লিখব-

from django.shortcuts import render 

# Create your views here.
def home_view(request): 
    context = () 
    return render(request, 'blog/index.html', context)

*** একটা কথা বলে রাখা ভাল, vs code এ অনেক সময় সার্ভার রান ঝামেলা করে, এই ঝামেলা থেকে মুক্তি জন্য আমরা template/Projects ফোল্ডারে থাকা অবস্থায় আরেকটা gitbash খুলে নেব এবং source env/Scripts/activate ও python manage.py runserver এ দুইটা কমান্ড দিয়ে ভার্চুয়াল এনভারমেন্ট তৈরি-অ্যাকটিভ করে সার্ভার রান করব।

Admin Dashboard + নিজেদের মডেল এ্যাডমিনে যোগ করা + Admin Dashboard সাজানো:CkEditor

জ্যাঙ্গোর জনপ্রিয় ফিচারগুলোর মধ্যে এর এ্যাডমিন এ্যাপ্লিকেশনটি যা জ্যাঙ্গোর সাথেই built-in থাকে। এটি যেকোন সাইট এ্যাডমিনিস্ট্রেশন অনেক সহজ করে দেয়। তো আসলে এটা করে টা কি? এই এ্যাপটিকে আপনার মডেল গুলোর নাম জানিয়ে দিলে সে আপনার জন্য সকল ডাটা অপারেশন (CRUD == Create Read Update Delete) করার জন্য বেশ চমৎকার ইন্টারফেইস তৈরি করে দিবে তেমন কোন কোডিং ছাড়াই । আপনি সেই ইন্টারফেইস ব্যবহার করে ডাটাবেইজে নতুন ডাটা ইনপুট করতে পারবেন, পুরাতন ডাটা দেখা, পরিবর্তন করা কিংবা মুছে ফেলতেও পারবেন বেশ সহজে । কষ্ট করে আর এ্যাডমিন প্যানেল বানানোর প্রয়োজন নেই ।

Admin dashboard:

জ্যাঙ্গো এডমিন ব্যবহার করতে python manage.py runserver কমান্ড দিয়ে জ্যাঙ্গো ডেভলপমেন্ট সার্ভার চালু করুন।

ব্রাউজার ওপেন করে এই ঠিকানায় যান http://127.0.0.1:8000/admin

লগিন করার একটা অপশন দেখতে পাবেন।

((( একদম ১মবার login এর জন্য যা করব- (মনে রাখবে) যেকোনো models এ একদম ১মবার superuser তৈরি করে নিতে হয়, যদি তা করা না হয়ে থাকে তবে অবশ্যই তৈরি করে নেবে। কমান্ড দেব(src ফোল্ডারে থাকা অবস্থায়)-

python manage.py createsuperuser 

ইউজার, পাসওয়ার্ড দিতে(২বার) হবে, email আপাদত না দিলেও সমস্যা নাই। (উপরেরটা কাজ না করলে এটা দেব- winpty python manage.py createsuperuser)

এখন আবার ডেভেলপমেন্ট সার্ভার চালু করুন ( python manage.py runserver কমান্ড দিয়ে) ও এবং ব্রাউজারের এডমিন প্যানেলের ঠিকানায় (http://127.0.0.1:8000/admin) যেয়ে একটু আগে তৈরি করা সুপার ইউজারের ইউজারনেম/পাসওয়ার্ড দিয়ে লগিন করুন! ব্যাস হয়ে গেল। )))

নিজেদের মডেল এ্যাডমিনে যোগ করাঃ

ডাটা মডেলকে ব্যবহার করা যায় জ্যাঙ্গো এ্যাডমিন থেকে।

এ্যাডমিন এ্যাপ্লিকেশন সংক্রান্ত সকল কোড রাখতে হবে আমাদের এ্যাপ্লিকেশন প্যাকেজের ভিতর admin.py নামক একটি ফাইলে। জ্যাঙ্গো এ্যাডমিন লোড হওয়ার সময় সকল ইনস্টল্ড এ্যাপ্লিকেশন এর ভিতর admin.py ফাইলগুলোকে রান করে। ফলে এই ফাইলে আমরা এ্যাডমিন এ্যাপ্লিকেশনকে বলে দিতে পারি আমরা এ্যাডমিন প্যানেলে আমাদের এ্যাপ্লিকেশন থেকে কি কি করতে দিতে চাই।

উদাহরণস্বরূপ- আপাতত আমাদের চাওয়া খুব সিম্পল, আমাদের blog মডেলটি দরকার এ্যাডমিন ইন্টারফেইসে। তাই আমরা blog/admin.py ফাইলটি তৈরি করে সেখানে এই কোড ব্যবহার করবো –

from django.contrib import admin
from .models import *

admin.site.register(Blog)

(((বিঃদ্রঃ অবশ্যই মনে করে models.py এর জন্য admin.py এ code যুক্ত করে নিতে হবে। তাই, এখন আমরা মডেল তৈরী করব। [মডেলের সহজ অর্থ হচ্ছে ডাটাবেস। তার অর্থ হচ্ছে আমাদের ডাটাবেস তৈরী করতে হবে।] এজন্য blog/models.py ফাইলে কোডটি লিখব-

from django.db import models

class Blog(models.Model):
    title = models.CharField(max_length=200)
    description = models.TextField()

)))

এই(blog/admin.py) কোডে আসলে আমরা জ্যাঙ্গো এ্যাডমিনকে বলে দিচ্ছি আমাদের blog মডেলটিকে এ্যাডমিন সাইটে রেজিস্টার করে নিতে । অর্থাৎ আমরা এ্যাডমিন এ্যাপকে বলে দিলাম আমাদের মডেলটির কথা যেন এ্যাডমিন এ্যাপ আমাদের সুযোগ করে দেয় সহজে এই মডেলটি ব্যবহার করার ।

এখন, আমরা এইটাকে মাইগ্রেট করব ও (http://127.0.0.1:8000/admin) এ ডুকব। এইজন্য আমরা দুইটা কমান্ড দিব- (মাইগ্রেট আসলে ডাটাবেস বা এসকিউএল কমান্ড। এইজন্য আমাদের এসকিউএল এ কাজ করতে হবে না, জ্যাংগোর কমান্ডের সাহায্যেই এই কাজ করা সম্ভব।)

python manage.py makemigrations 
python manage.py migrate
python manage.py runserver
এর ফলে ডাটাবেস তৈরী হবে। আপনার প্রজেক্ট ফোল্ডারে দেখতে পারবেন db.sqlite3 নামে একটা ফাইল তৈরী করা হয়েছে । যেখানে ডাটাবেসের টেবিল গুলা আছে । ডাটাবেসের টেবিল গুলা দেখার জন্য SQLITE Viewer নামে VSCode এ একটা এক্সটেনশন পাওয়া যায় ।
 

# কিছু ব্যাপার বিস্তারিত: আমাদের তৈরি করা অ্যাপ এবং সেটার মডেল এখানে দেখা যাচ্ছে তো? এটা অটোমেটিক ভাবে দেখা যায়না বরং এডমিনে মডেল এড করে নিতে হবে (যা already আগেই আমরা করে রেখেছি)।

আপাতত সবকিছু বুঝে ফেলার দরকার নেই, (http://127.0.0.1:8000/admin) পেইজটা ভালো করে দেখুন, উপরের ডান পাশের মেনুটা দেখুন, লগআউট, পাসওয়ার্ড চেঞ্জ, ভিউ সাইট! নাম দেখেই বোঝা যাচ্ছে কোন টা কি কাজের! যেটা বোঝা যাচ্ছেনা সেটা হল মাঝের অংশটা। Site administration লেখার নিচে Grups, Usres লেখাগুলো আসলে ‘মডেল’! মডেল চিনেনতো !? এ দুটি মডেল হল জ্যাঙ্গোর অথেনটিকেশন এবং অথারাইজেশন অ্যাপ এর মডেল। এডমিন প্যানেলের মাধ্যমে আমরা যেকোনো অবজেক্টকেই ক্রিয়েট/রিড/আপডেট/ডিলেট করতে পারব! এই পার্টে আমরা শুধু অবজেক্ট রিড এবং আপডেট করা দেখেছি।

মনে রাখবেনঃ জ্যাঙ্গো ওআরএম এ প্রতিটা মডেল হল ডাটাবেইজের একেকটা টেবিল, মডেলের ফিল্ডগুলো হল ডাটাবেইজের টেবিলের কলাম, মডেলের প্রতিটা ইন্সট্যান্স (মডেল থেকে তৈরি করা প্রতিটা অবজেক্ট) হল টেবিলের ফিল্ড বা ডাটা বা ‘রো’ ! অবশ্যই, মনে করে models.py এর জন্য admin.py এ code যুক্ত করে নিতে হবে।

বি:দ্র: পাইথনে যখন-ই database এর সাথে সম্পর্কিত যেমন- models এর কোনো কিছু আপডেট বা যুক্ত/বাদ দেওয়া হবে তখন প্রতিবার-ই টার্মিনালে দুইটা(/তিনটা) কাজ করতে হয়(লিখে enter press করতে হবে):-

python manage.py makemigrations
python manage.py migrate
python manage.py runserver

এবার, (http://127.0.0.1:8000/admin) বা localhost:8000/admin এ গিয়ে admin panel এ লগিন করব।

ক্লাসিক এডিটর(CK editor)[app] তৈরি: প্রথমে, কমান্ড প্রম্পট এর মাধ্যমে(প্রজেক্ট ফোল্ডার অবস্থানে, src) ckeditor install করে নেবঃ(src ফোল্ডারে থাকা অবস্থায়)-

pip install django-ckeditor

এখন এ লাইব্রেরিটাকে config করে নেব, এজন্য django ckeditor documentation গুগলে সার্চ করে ঐখান থেকে দেখে নেব।

এখন, blogproject>settings.py ফাইলে গিয়ে INSTALLED_APPS এর শেষে লিস্টে ‘blog’, এর পরে ‘ckeditor’, (এটা লাগবে না) ও ‘ckeditor_uploader’, যুক্ত করে নেব।

ও settings.py এর একদম শেষে যুক্ত করি –

CKEDITOR_UPLOAD_PATH = "uploads/"

ও settings.py এর STATIC_URL = ‘static/’ এ লাইনের নিচে যুক্ত করে নেব:-

STATIC_URL = 'static/'
STATICFILES_DIRS = [BASE_DIR / 'static']
STATIC_ROOT = os.path.join(BASE_DIR / 'staticfiles')

MEDIA_URL = 'media/'
MEDIA_ROOT = BASE_DIR / 'media/'

মাইগ্রেট করে এটা দিয়ে সার্ভার রান করলে প্রজেক্ট ফোল্ডারের() ভেতর অটোমেটিক কিছু ফাইলসহ static নামে আরো একটি ফোল্ডার তৈরি হয়ে যাবে। তাহলে, প্রজেক্ট ফোল্ডারে(src) মোট ফোল্ডার গিয়ে দাড়াচ্ছি ৪টা[blog,core,static,templates] ও ২টি ফাইল[dbsqlite3,manage]

আর প্রজেক্ট > urls.py তে যুক্ত করব –

path('ckeditor/', include('ckeditor_uploader.urls')),

এরপর, blog>models.py ফাইলের উপরে ckeditorটাকে(মিডিয়াসহ) ইউজ করতে যুক্ত করে নিতে হয়-

from ckeditor_uploader.fields import RichTextUploadingField

এক্ষেত্রে, কন্টেন্ট এডিটরে ckeditor শো করাতে content = models.TextField(blank=True, null=True) এর জায়গায় content = RichTextField(blank=True, null=True) দেব।

[[[ অথবা, মিডিয়া ইউজ না করতে চাইলে তখন from ckeditors.ckeditors.fields import RichTextField দিলেও হয়। সেক্ষেত্রে,, কন্টেন্ট এডিটরে ckeditor শো করাতে content = models.TextField(blank=True, null=True) এর জায়গায় content = RichTextField(blank=True, null=True) দেব। ]]]

TAG কনফিগারেশনঃ এখন,

pip install django-taggit

আবার, blogproject>settings.py ফাইলে গিয়ে INSTALLED_APPS এর শেষে লিস্টে ‘blog’, এর পরে ‘taggit’, যুক্ত করে নেব। ও মাইগ্রেট করে নিতে হবে।

এবং ও settings.py এর একদম শেষে যুক্ত করি –

TAGGIT_CASE_INSENSITIVE = True

আর, models.py তে এরকম করে যুক্ত করি – (উপরে ও ফাংশনে)

from taggit.managers import TaggableManager

class Post(models.Model):
    tags = TaggableManager()

ImageField : ImageField এর জন্য Pillowটা install করতে হবে, এজন্য কমান্ড দিতে হবে(src ফোল্ডারে থাকা অবস্থায়):

pip install Pillow

slug কনফিগারেশনঃ slugify, কমান্ড দিতে হবে(src ফোল্ডারে থাকা অবস্থায়):

pip install python-slugify

Category কনফিগারেশনঃ

তো, MVT এর যা যা হল-

ভিউ থেকে ডাটা রিড করা

এরপর, MVT এর যা করব-

মডেল তৈরি হয়ে গেলো

টেমপ্লেট এর কাজকারবার গুলো (ট্যাগ, ফিল্টার,,,,, etc)

Blog Design: Full

Planning & Creating

এবার, মডেল ফাইল কনফিগ করার পালা।

((( Planing: একটা Blog এ যা যা থাকে-

মডেল তৈরী(টাইটেল, স্লাগ, কন্টেন্ট etc), বিস্তারিত-
স্লাগ: স্লাগ অটো জেনারেট হওয়া
কন্টেন্ট: মডেলের কন্টেন্ট অংশে ব্লক তৈরী ( h1, h2, p, image, ) ইত্যাদি; [RichTextUploadingField]
  • Blog name, blog description || feature Post || Post Stories
  • Post, featured image, Description || author name, tag(category), date(pub_date, mod_date)

ক্যাটাগরি: মডেল তৈরী ও ফরেন কী সেটাপ(নতুন)।

Tags, etc. )))

models.py ও admin.py file Config : Slugify, TaggableManager, RichTextUploadingField

এখন, template>Projects>src>templates>blog>models.py ফাইলের ভেতর গিয়ে edit করব:-

from django.db import models
from ckeditor_uploader.fields import RichTextUploadingField
from taggit.managers import TaggableManager
from django.utils.text import slugify

class Blog(models.Model):
    blog_name = models.CharField(max_length=50)
    description = models.CharField(max_length=150)

    def_str_(self): 
        return self.blog_name

class Post(models.Model):
    title = models.CharField(max_lenght=200)
    slug = models.SlugField(max_length=150, unique=True, null=True, blank=True)
    content = RichTextUploadingField(blank=True, null=True)
    featured_image = models.ImageField(upload_to = 'uploads/', null=True, blank=True)
    tags = TaggableManager(blank=True)
    # category = models.ForeignKey(Category)
    featured = models.BooleanField(default=False)
    pub_date = models.DateTimeField(auto_new_add = True)
    mod_date = models.DateTimeField(auto_new_add = True)
    # post_status = models.IntegerField(choices=status, default=0)

    meta_title = models.CharField(max_length=200, blank=True, null=True)
    meta_description = models.CharField(max_length=300, blank=True, null=True)
    
    def_str_(self):
         return self.title

    def save(self, *args, **kwargs)
        self.slug=slugify(self.title)
    super().save(*args, **kwargs)

class Tags(models.Model):
    title=models.CharField(max_length=200)
    slug = models.SlugField(max_length=150, unique=True, null=True, blank=True)

    def_str_(self):
        return self.title

    def save(self, *args, **kwargs)
        self.slug=slugify(self.title)
    super().save(*args, **kwargs)

class Category(models.Model):
    title=models.CharField(max_length=200)
    slug = models.SlugField(max_length=150, unique=True, null=True, blank=True)

    def_str_(self):
        return self.title

    def save(self, *args, **kwargs)
         self.slug=slugify(self.title)
     super().save(*args, **kwargs)

বিঃদ্রঃ অবশ্যই মনে করে উপরের models.py codeটার জন্য, নিচের admin.py এ codeটা যুক্ত করে নিতে হবে।

এজন্য, blog>admin.py ফাইল edit করে যা লিখব:-

from django.contrib import admin
from .models import *

# Register your models here.
admin.site.register(Blog)
admin.site.register(Post)
#admin.site.register(Category)
#admin.site.register(Tags)

এবং এ চেঞ্জের জন্য migratation করে নিতে হবে।

এখানে উপরের কোডের জন্য সেটিং(ব্যাখ্যা সহ):settings.py ফাইল

এছাড়া, blogproject>settings.py ফাইলটি ফাইনালি যেমন হবে-

 

[settings.py ও urls.py] static File Config:

কোথায় কি ফোল্ডার থাকবে তার লিস্টঃ

এখন, অনলাইন হতে একটা রেডিমেড টেমপ্লেট থিম যার নাম mediumish-html এটা ডাউনলোড করব,(লিংক: https://www.free-css.com/free-css-templates/page271/mediumish)

— template>Projects>src>templates>blog এর এখানে টেমপ্লেট ফাইল গুলো অর্থাৎ যে ফোল্ডারে index.html,post.html,(author.htmlটা লাগবে না) ফাইলগুলো রয়েছে।

এবার, সার্ভার রান করে localhost:8080 তে ডুকলে দেখা যাবে, কিছু css মিসিং। এ সমস্যা সমাধানের জন্য আমাদের স্টাটিক ফাইল config করে নিতে হবে। এবং, template/Projects/src/templates/staticএর এখানে static ফাইলগুলো অর্থাৎ assets নামের ফোল্ডারটি রাখব।

— এখন, প্রজেক্ট ফোল্ডারে অবস্থানে(src) কমান্ড দেব – python manage.py

তাহলে django এর অনেকগুলো কমান্ড দেখতে পাব।

এর মধ্য থেকে এখন আমরা collectstaticটা ইইজ করব।

python manage.py collectstatic

মাইগ্রেট করে এটা দিয়ে সার্ভার রান করলে static ফোল্ডার থেকে ফাইল গুলো কালেক্ট হবে ও কাজ করবে।

এখন, এবার, django static files configuration করার পালা।

template>Projects>src>templates>blog>index.html ফাইলের ভেতর গিয়ে edit করব:-

• একদম উপরে {% load static %}

•((( তাছাড়া, আপাদত টেস্ট চালানোর জন্য- যেখানে যেখানে ” ” যুক্ত সোর্স লিংক আছে যেমন href, img, js etc এর এর ভেতর শুরুতে {% static ‘ এটা যুক্ত করে নেব এবং শেষে ‘  %} যুক্ত করে নেব। তাহলে boostrap-css এগুলা কাজ করবে। এভাবে html পেজটি সুন্দরভাবে সম্পূর্ণ লোড হবে, যখন সার্ভার রান করা হবে।)))

তাহলে boostrap-css এগুলা কাজ করবে। এভাবে html পেজটি সুন্দরভাবে সম্পূর্ণ লোড হবে।

আমরা জানি, জ্যাংগো তে সব url গুলোকে urls.py তে দিয়ে দিতে হয়।  তাহলে ডাউনলোড করা টেম্পলেট এর url গুলো ঠিকভাবে কাজ করবে।

এজন্য এখন, blog>urls.py তে গিয়ে সেখানে static file url django বা server static files during development(গুগল সার্চ করলে পাবা) এর import দুইটা লাইন আগের import দুইটা লাইনের পরে add করে নিতে হবে((urls.py Config আপডেট করে নেব)):

from django.conf import settings
from django.conf.urls.statics import static

এবং urlpatterns এর পরে লাইনটা add করে নিতে হবে:

+ static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

(((Extra: এখানে, STATIC_URL এর জায়গায় MEDIA_URL এবং STATIC_ROOT এর জায়গায় MEDIA_ROOT ব্যবহার করা হয়েছে)))

তাহলে, blog>urls.py হবে-

from django.urls import path
from . import views
from django.conf import settings 
from django.conf.urls.statics import static

urlpatterns = [
    path('', views.home_view, name = 'home'),
]+ static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

তো এবার, যখন সার্ভার রান ও মাইগ্রেট করা হবে, html পেজটি সুন্দরভাবে সম্পূর্ণ লোড হবে ও boostrap-css এগুলা কাজ করবে।

এখন, এখানের views.home_view এর জন্য views.py ফাইলে ফাংশন টি নিয়ে কাজ করতে হবে।

(views.py ও Template Config) Frontend এর কাজ কারবার:

এখন, blog>views.py ফাইলে গিয়ে edit করব-

from django,shortcuts import render 
from .models import *

# Create your views here.
def home_view(request):
    blog = Blog.objects.filter()
    featured_post = Post.objects.filter(featured=True)[:4]
    stories_post = Post.objects.filter(featured=False)
    context = {'blog':blog, 'featured_post':featured_post, 'stories_post':stories_post,}
    return render(request, 'blog/index.html', context)

এখানে উপরের কোডের জন্য সেটিং(ব্যাখ্যা সহ):

ব্লগের নাম ও ডিসক্রিপশন সেকশন ঠিক করাঃ

index.html থেকে ব্লগের নাম ও ডিসক্রিপশন অংশ খুঁজে বের করব। সেখানে,

  • ব্লগের নাম এর জায়গায় ঐ লেখার পরিবর্তে লিখব {{blog.blog_name}} এবং
  • ডিসক্রিপশনের নাম এর জায়গায় ঐ লেখার পরিবর্তে লিখব {{blog.desdescription}}

আর অবশ্যই,  blog>views.py ফাইলে গিয়ে ফাংশনে blog = Blog.objects.filter() যুক্ত করব এবং context এ ‘blog’:blog, যুক্ত করব।

(djano queryset লিখে গুগল সার্চ করলে filter নিয়ে বা ব্যাপার-স্যাপার জানতে পারবো।)

featured_post সেকশন ঠিক করাঃ

 index.html থেকে featured_post অংশ খুঁজে বের করব (একটা রেখে বাকি পোস্ট ডিলিট করে টেস্টিং স্টেপে আমাদের কাজ চালাব)। সেখানে,

  • begin post পার্টের শুরুর আগে উপরে {% for featured in featured_post %} যুক্ত করব এবং begin post পার্টের শেষে এর নিচে {% endfor %} যুক্ত করব।
  • image url link গুলোর {%static __%} এর স্থলে {{feature.featured_image.url}} দেব। এবং
  • title(card-title) এর টেক্সট ভ্যালু এর জায়গায় {{feature.title}} দেব।
  • description(card-text) এর টেক্সট ভ্যালু এর জায়গায় {{feature.content|truncatecharschars:150|safe}} দেব, পুরো content না দেখিয়ে এর ছোট একটা অংশ দেখানোর জন্য truncated in django template(গুগল সার্চ করলে পাবা) ব্যবহার করব।
    (static file url django লিখে গুগল সার্চ করলে url নিয়ে বা ব্যাপার-স্যাপার জানতে পারবো।)
  • date(post-title) এর টেক্সট ভ্যালু এর জায়গায় {{feature.mod_date}} দেব।
  • আর, যেখানে যেখানে a href আছে এর লিংক টেক্সট ভ্যালু এর জায়গায় {{feature.slug}} দেব।
  • author টা পরে দেখব, তাই সেখানের link অংশটা আপাদত এটা কেটে দেব। কারণ সেখানে বাড়তি একটা সেটিং আছে।

আর অবশ্যই, blog>views.py ফাইলে গিয়ে ফাংশনে featured_post = Post.objects.filter(featured=True)[:4] যুক্ত করব এবং context এ ‘featured_post’:featured_post, যুক্ত করব।

Blog stories সেকশন ঠিক করাঃ

 index.html থেকে Begin List Posts অংশ খুঁজে বের করব। (একটা রেখে বাকি পোস্ট ডিলিট করে টেস্টিং স্টেপে আমাদের কাজ চালাব) সেখানে,

  • <!– begin post –> পার্টের শুরুর আগে উপরে {% for story in story_post %} যুক্ত করব এবং begin post পার্টের শেষে এর নিচে {% endfor %} যুক্ত করব।
  • image url link গুলোর {%static __%} এর স্থলে {{story.featured_image.url}} দেব। এবং
  • title(card-title) এর টেক্সট ভ্যালু এর জায়গায় {{story.title}} দেব।
  • description(card-text) এর টেক্সট ভ্যালু এর জায়গায় {{story.content|truncatecharschars:150|safe}} দেব, পুরো content না দেখিয়ে এর ছোট একটা অংশ দেখানোর জন্য truncated in django template(গুগল সার্চ করলে পাবা) ব্যবহার করব।
    (static file url django লিখে গুগল সার্চ করলে url নিয়ে বা ব্যাপার-স্যাপার জানতে পারবো।)
  • date(post-title) এর টেক্সট ভ্যালু এর জায়গায় {{story.mod_date}} দেব।
  • আর, যেখানে যেখানে a href আছে এর লিংক টেক্সট ভ্যালু এর জায়গায় {{story.slug}} দেব।
  • author টা পরে দেখব, তাই সেখানের link অংশটা আপাদত এটা কেটে দেব। কারণ সেখানে বাড়তি একটা সেটিং আছে।

আর অবশ্যই, blog>views.py ফাইলে গিয়ে ফাংশনে stories_post = Post.objects.filter(featured=False) যুক্ত করব এবং context এ ‘stories_post’:stories_post, যুক্ত করব।

এখন, Admin dashboard এ গিয়ে একটা Post দিই। এভাবে যতগুলো post ই দিই সেগুলো নিজে নিজে সুন্দরভাবে বসে যাবে।

Template(extend)টা সাজাবো

template এর header ও footer সব জায়গায় আছে।এবার, আমরা Templateটাকে সাজাবো।

এজন্য, blogproject>templates>partial ফোল্ডারের ভেতর base.html নামে একটা ফাইল বানাবো। এখন base.html এর উপর অংশে, index.html এর একদম উপর থেকে menu এর শেষ পর্যন্ত কোডগুলো নিয়ে রাখবো।

এরপর base.html এর মাঝের অংশে, অর্থাৎ ঐ কোডের পরে {% block content %}{% endblock content %} এটা যুক্ত করব।

এরপর base.html এর শেষ অংশে, index.html এর একদম নিচে থাকা footer কোডগুলো নিয়ে রাখবো।

এতে দেখা যাবে, পুরো জিনিস এলোমেলো হয়ে গেসে, কারণ এতে css নাই।

এখন, blogproject>templates>blog>index.html ফাইল এর,

  •  একদম উপর লাইনে যুক্ত করব-, {% extends ‘partial/base.html’ %}
  • এরপরের লাইনে যুক্ত করব-, {% block content %} {% endblock content %}
  • একদম শেষ লাইনে যুক্ত করব-, {% endblock content %}

এখন, localhost:8000 রিফ্রেশ করলে css সহ html পেজ সুন্দরভাবে hompageটা লোড নিবে।

Working with Single Post:

এখন, hompage এর প্রতিটি পোস্ট(hyperlink) এ ক্লিক করলে কিছুই আসবে না, সেটা ঠিক করার জন্য single page সেটিং ঠিক করতে হবে।

এখন, blog>urls.py ফাইলে edit করব(এ ফাইলটা আমরা আগে তৈরি করে নিয়েছিলাম):

এখানে, urlpatterns লিস্টে শেষে path(‘<slug:slug>’, views.single_view, name = ‘single’ ), এটা যুক্ত করে নেব।

from django.urls import path
from . import views
from django.conf import settings 
from django.conf.urls.statics import static

urlpatterns = [
    path('', views.home_view, name = 'home'),
    path('<slug:slug>', views.single_view, name = 'single' ),
]+ static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

single.home_view যেটা লিখেছি, ঐটা আসলে এখনো তৈরি করা হয়নি, তাই এটা তৈরি করে নিব। views.py ফাইলে যুক্ত করব-

def single_view(request,slug):
    post = get_object_or_404(Post, slug=slug)
    context = {'post':post}
    return render(request, 'blog/post.html', context)

আর, from django,shortcuts import render এই ১ম লাইনটা এডিট করে এর পরিবর্তে লিখব:

from django,shortcuts import render, get_object_or_404

এখন, post.html ফাইলে,

  • profile অংশটা আমরা আপাদত তৈরি করছি না, তাই ওইটা ডিলিট করে দিই(begin top meta থেকে শুরু করে end top meta)।
  • হেডারের menu এর অংশটা এখন ডিলিট করে দেব এবং একদম উপরে লিখব-
    {% extends ‘partial/base.html’ %}
    {% load static %}
    এরপর দেব- {% block content %}
  • আর,
  • একদম শেষে অর্থাৎ ফুটার যেখান থেকে শুরু হয়েছে সেখান থেকে </html> পর্যন্ত delete করে দেব এবং সেখানে লিখব-
    {% block content %}
  • end related posts এর পরে twitter timeline অংশটা ডিলিট করে দিই।

এবার, ড্যাশবোর্ড থেকে পোস্ট দিলে সেগুলোর প্রতিটি জিনিস যাতে ঠিকভাবে শো করে এজন্য post.html ফাইলে সেটিং করে নেব-

  • h1 title পার্ট এর টেক্সট ভ্যালু অংশটা এডিট করে লিখব: {{post.title}}
  • feature image পার্ট এর src টেক্সট ভ্যালু অংশটা এডিট করে লিখব: {{post.featured_image.url}}
  • Post content পার্ট এর <div class=’article-post’> </div>এর ভেতর অংশটা এডিট করে লিখব: {{post.content|safe}}
  • Begin Tags এর <ul class=”tags”> এর ভ্যালুর অর্থাৎ এর নিচের লাইনগুলো ডিলিট করে সেখানে লিখব-
    {% for tag in post.tags.all %}
    <li><a href=”#”> {{ tag.name }}</a></li>
    {% endfor %}
  • এখন, আমরা লিংকআপ করা দেখব, এজন্য- base.html এ <!– Begin Logo –> এর linkটার টেক্সট ভ্যালুর জায়গায় লিখব-  {% url ‘home’ %}    ||| একই জিনিসটা Begin Menu এর nav-linkটা এর ভ্যালু টেক্সট এর জায়গায় লিখব- {% url ‘home’ %}

Working with Meta Data:

এখন আমরা প্রত্যেকটি পোস্ট এর জন্য title, description, keyword এসব মেটা ডাটা যুক্ত করব। এজন্য, models.py ফাইলে যুক্ত করব-

    meta_title = models.CharField(max_length=200, blank=True, null=True) 
    meta_description = models.CharField(max_length=300, blank=True, null=True)

এরপর, মাইগ্রেশন করব।

এখন, Meta information চেঞ্জ করার জন্য base.html ফাইল এর ভেতর, <head> এর কয়েকলাইন নিচে যেখানে <title> আছে ঐটার পুরো কোডটার আগে {% block metainfo %} ও পরে {% endblock metainfo %} সংযুক্ত করে দেব। এরপর দেখলাম যে, <title> এর পুরো লাইনটা না দিলেও সমস্যা নাই তাই ঐটা কেটে দিলাম।

এখন, আবার index.html এ গিয়ে ২ইয় লাইনটি অর্থাৎ {% block content %} এর আগে/উপরে নিচের এটা যুক্ত করব-

{% block metainfo %} 
{% if post.meta_title %}
<title>{{post.meta_title}}</title>
{% elif post.title %}
<title>{{post.title}}</title>
{% endif %}
<title>{{post.meta_title}}</title>
{% endblock metainfo %}

(template if else in django লিখে গুগল সার্চ করলে খুঁটিনাটি জানতে পারো)

django template cache

এখন দেখব, ওয়েবসাইট এর যেসব elements বিভিন্ন পেজেও চেঞ্জ হয় না অর্থাৎ একই/স্থির থাকে এমন যেমন- হেডার, ফুটার ইত্যাদি গুলোকে cache ইউজ করার মাধ্যমে fast loading করা যায়। django template cache নিয়ে যা গুগল করলে পাবেন।

# [হেডার মেনু অংশ যেহেতু চেঞ্জ হচ্ছেনা এজন্য এটায় মূলত cache ইউজ করা হয়]:- base.html এর একদম উপরের পার্টে হেডারে অর্থাৎ যেখানে {% load static %} আছে তার উপরে {% cache 500 header %} লেখাটা যুক্ত করি এবং <! End Nav এর নিচে অর্থাৎ হেডারের শেষে {% endcache %} লেখাটা যুক্ত করি।

আবার একইভাবে, [ফুটার অংশ যেহেতু চেঞ্জ হচ্ছেনা  এজন্য এটায়ও মূলত cache ইউজ করা হয়]:- ফুটারের অংশের শুরুতে {% cache 500 footer %} বসাবো এবং ফুটার অংশের শেষে অর্থাৎ </html> লেখাটির নিচে {% endcache %} বসাবো।

# এরপর, index.html এর একদম উপরের পার্টে অর্থাৎ {% extends ‘partial/base.html’ %} লেখা আছে এর নিচে {% load cache %} লেখাটা বসাবো।

ও, post.html এর একদম উপরের পার্টে অর্থাৎ {% extends ‘partial/base.html’ %} {% load static %} লেখা আছে এর নিচে {% load cache %} লেখাটা বসাবো।

এবং base.html এরও একদম উপরের পার্টে অর্থাৎ {% cache 500 header %} ও {% load static %} এর মাঝে {% load cache %} লেখাটা বসাবো।

ব্যাস।

তাহলে, ফাইনালি কোডগুলো নিম্নরূপ-

base.html

index.html

post.html

Similar Posts

Leave a Reply

Your email address will not be published. Required fields are marked *