05 জ্যাংগো Architecture পার্ট ০৪: (Admin+মডেল) dashboard, View-Template, Url Config

এডমিন পরিচিতি

সাইটের ডেভেলপার হিসেবে আপনাকে দুটি ইন্টারফেস তৈরি করতে হবে, একটি পাঠক বা ভিজিটরের জন্য যেখানে শুধু সাইটের কনটেন্ট দেখা যাবে, আরেকটি এডমিন/এডিটর বা সাইটের মালিকের জন্য, যেখানে সাইটের কনটেন্ট তৈরি বা পরিবর্তন বা ডিলেট করা যাবে!

আপনি যদি ব্লগস্পট, ওয়ার্ডপ্রেস বা অন্যকোন কনটেন্ট ম্যানেজমেন্ট সিস্টেমের সাথে পরিচিত হন তাহলে এটা আপনার কাছে আরো স্পষ্ট হবে। কনটেন্ট ম্যানেজমেন্ট সিস্টেমে পোস্ট করতে হলে আপনাকে এডমিন হিসেবে লগিন করতে হয়, এবং পোস্ট লেখার বা সাইটের অন্যান্য কনটেন্ট ম্যানেজ করার যে প্যানেলটা থাকে সেটাই এডমিন প্যানেল বা ড্যাশবোর্ড! এটা কিন্তু সাধারন ভিজিটর ব্যবহার করতে পারেনা। শুধু এডমিন বা সাইটের মালিক ব্যবহার করতে পারে!

তো প্রায় প্রতিটি ওয়েবসাইটের বাইরের রূপ (যেটা সাধারন ভিজিটর দেখতে পারে) এর সাথে একটা ভিতরের রূপ (যেটা শুধু এডমিনের জন্য) থাকে। ডেভেলপার হিসেবে আপনাকে এই দুটি রূপই ডেভলপ বা ডিজাইন করতে হবে!

জ্যাঙ্গো আপনার এই কষ্ট অর্ধেক কমিয়ে দেয় তার এডমিন অ্যাপ এর মাধ্যমে! আপনি যেকোন সাইটই তৈরি করেননা কেন, সেটার জন্য রেডিমেড একটা এডমিন প্যানেল পেয়ে যাবেন। সব কিছু বিল্টইন সেট করাই থাকবে, আপনার কাজ হল সেটাকে নিজের মত করে কাস্টোমাইজ করে নেয়া!

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

এ্যাডমিন এ্যাপ্লিকেশন চালু করা:

জ্যাঙ্গো এ্যাডমিন এ্যাপ্লিকেশনটি পাওয়া যাবে django.contrib.admin প্যাকেজে । তাই আমাদেরকে settings.py এর INSTALLED_APPS সেকশনটিতে এই এ্যাপ্লিকেশন টি যোগ করে নিতে হবে । এই কাজটি কিভাবে করতে হবে তার উদাহরণ আমরা প্রথম অধ্যায়ে দেখেছি ।

এ্যাডমিন এ্যাপ্লিকেশনটি তার ব্যবহারের জন্য বেশ কিছু ডাটা মডেল সরবরাহ করে । তাই এ্যাপ্লিকেশনটি ব্যবহার করার আগে আমাদের syncdb কমান্ডটিও চালানো প্রয়োজন হবে –

python manage.py syncdb

এই প্রসেসের শেষে একটি সুপার ইউজার তৈরি করার প্রম্পট পাওয়া যাবে । এ ব্যাপারে আগের অধ্যায়ে আলোচনা করা হয়েছে । এই কমান্ড চালানোর ফলে জ্যাঙ্গো এ্যাডমিন এ্যাপের জন্য প্রয়োজনীয় সব টেবিল তৈরি করে নিবে ।

এবার আমাদেরকে বলে দিতে হবে কোন URL ভিজিট করলে এ্যাডমিন এ্যাপটি পাওয়া যাবে । জ্যাঙ্গোর এই ডেফিনিশনগুলো থাকে mysite/urls.py ফাইলে ।

আমরা ফাইলটি এডিট করে এরকম রুপ দেই –

from django.conf.urls import patterns, include, url

from django.contrib import admin
admin.autodiscover()

urlpatterns = patterns('',
    url(r'^admin/', include(admin.site.urls)),
)

জ্যাঙ্গোর urls.py তে মূলত একটি ভ্যারিয়েবল থাকে urlpatterns নামে যেটিতে আমরা সব URL এর জন্য ডেফিনিশন প্রদান করি । এটি কিভাবে কাজ করে তা আমরা জ্যাঙ্গো এপিআই থেকে আরো বিস্তারিত দেখে নিবো পরবর্তীতে কোন এক সময় ।

আমরা আপাতত এই urlpatterns এ আমাদের ডেফিনিশন যোগ করে দিলাম ।

url(r'^admin/', include(admin.site.urls))

এটির মানে হলো যদি রিকুয়েস্ট করা URL এর প্রথমে admin থাকে তবে যেন জ্যাঙ্গো admin.site.urls থেকে ডেফিনিশন ইম্পোর্ট করে নেয় । include ব্যবহার করে আমরা আমাদের urlpatterns এর মধ্যে প্রয়োজনীয় url ইম্পোর্ট করে নিতে পারি সহজেই!

চালু করি ডেভ সার্ভার:

এ্যাডমিন এ্যাপ্লিকেশনটি চেখে দেখার জন্য আমাদের এবার ডেভেলপমেন্ট সার্ভারটি চালু করে নিতে হবে । কমান্ডটি যদিও এর আগে দেখানো হয়েছে তবু আরেকবার দেখে নেই –

python manage.py runserver

পুনশ্চ: এই কমান্ডটি জ্যাঙ্গো এ্যাপ্লিকেশন ডেভেলপমেন্টে বোধহয় সবচাইতে বেশী ব্যবহৃত কমান্ড । তাই এটি আত্মস্থ করা অতীব জরুরী ।

ডেভ সার্ভার রান করলে এবার চটপট ব্রাউজারে এই URL টা আমরা ভিজিট করি –

http://127.0.0.1:8000/admin/

যদি আপনি সব কিছু ঠিক ঠাক মতো করে থাকেন তবে এরকম একটি ইন্টারফেইস পাবেন –
django-admin

আর যদি এরকম স্ক্রীন না এসে কোন ইরর মেসেজ দেখায় তবে ধাপগুলো আবার চেক করুন, খুজে বের করুন কোথায় ভুল হয়েছে ।

এ্যাডমিন প্যানেলে লগিন করা

জ্যাঙ্গো এ্যাডমিন এ্যাপটি যোগ করে প্রথমবার syncdb রান করার পর একটি সুপার ইউজার তৈরি করেছিলাম আমরা । এ্যাডমিন প্যানেলে প্রবেশ করার জন্য সেই এ্যাকাউন্টটির ইউজারনেইম এবং পাসওয়ার্ড ব্যবহার করুন । যদি সেই সময় সুপার ইউজার তৈরি করা না হয়ে থাকে বা কোন কারণে নতুন আরেকটি এ্যাকাউন্ট প্রয়োজন হয় তবে নতুন সুপার ইউজার তৈরি করার জন্য এই কমান্ডটি রান করুন –

python manage.py createsuperuser

লগিন করার পর আমরা এরকম একটি স্ক্রীন দেকতে পাবো –
django-admin-home

এখান থেকে আমরা বিভিন্ন এ্যাপ্লিকেশন এর মডেলগুলো এ্যাক্সেস করতে পারি । উদাহরণ স্বরুপ জ্যাঙ্গোর Auth এবং Sites এ্যাপ্লিকেশনের মডেলগুলো আমরা এই স্ক্রীনশটে দেখতে পারছি ।

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

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

আপাতত আমাদের চাওয়া খুব সিম্পল । আমাদের ভোটাভোটির জন্য Poll মডেলটি দরকার এ্যাডমিন ইন্টারফেইসে । তাই আমরা polls/admin.py ফাইলটি তৈরি করে সেখানে এই কোড ব্যবহার করবো –

from django.contrib import admin
from polls.models import Poll

admin.site.register(Poll) 

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

ফাইলটি এ্যাড করার পর ব্রাউজারে আবার এ্যাডমিন সাইটে প্রবেশ করুন । এবার চিত্রটি হবে অনেকটা এরকম –

django-admin-polls

Polls লিংক এ ক্লিক করলে এরকম একটি স্ক্রীন পাবেন –

django-admin-polls-list

আমরা চাইলে আমাদের আগেই সেইভ করা এন্ট্রিটি পরিবর্তন করতে পারি –

edit-poll
জ্যাঙ্গো এ্যাডমিন(সারমর্ম);

এতক্ষণ ধরে আমরা যা দেখলাম তা হলো কত সহজে আমাদের ডাটা মডেলকে ব্যবহার করা যায় জ্যাঙ্গো এ্যাডমিন থেকে । জ্যাঙ্গো এ্যাডমিন বেশ কাস্টোমাইজেবলও বটে । নানা ধরণের অপশন ব্যবহার করে এটিকে সাজিয়ে নেওয়া যায় নিজের ইচ্ছামত । এ্যাডমিন সাইট কাস্টোমাইজেশন নিয়ে পরবর্তীতে বিস্তারিত আলোচনা থাকবে ইনশাআল্লাহ!

এডমিন dashboard

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

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

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

জ্যাঙ্গো এডমিন প্যানেল আশা করে যে এডমিন (জ্যাঙ্গোর পরিভাষায় বলে সুপার ইউজার) তার ইউজারনেম এবং পাসওয়ার্ড দিয়ে লগিন করবে। কিন্তু আপনার কাছে তো ইউজারনেম/পাসওয়ার্ড নেই!!

সমস্যা নেই, আমরা ইউজারনেম/পাসওয়ার্ড বানিয়ে নিব, প্রথমে কমান্ড প্রম্পট (টার্মিনাল) এ যান। সেখানে দেখবেন এখনো সার্ভার চালু করা। কন্ট্রোল সি (Ctrl + c ) বাটন দুটি চেপে সার্ভার বন্ধ করুন! এরপর সুপার ইউজার তৈরি করার নিচের কমান্ডটি দিনঃ

python manage.py createsuperuser

আপনার ইউজারনেম, ইমেইল এবং পাসওয়ার্ড চাইবে সেগুলো দিন। সঠিক ভাবে সব কিছু দিলে সেখানে সুপার ইউজার তৈরি হয়েছে বলে একটা মেসেজ শো করবে।

লক্ষ্য করুন, পাসওয়ার্ড কিন্তু দুইবার দিতে হবে, পাসওয়ার্ড কমান্ডপ্রম্পট বা টার্মিনালে শো করবেনা তাই পাসওয়ার্ড টাইপ করার সময় সেটা স্ক্রিনে না দেখে ঘাবড়াবেন না! পাসওয়ার্ড স্ট্রং এবং লম্বাচওড়া হতে হবে, ১২৩৪৫ টাইপের পাসওয়ার্ড দিলে কাজ হবেনা!

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

লগিন করলে আপনি এরকম একটা কিছু দেখতে পারবেনঃ

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

আমাদের তৈরি করা অ্যাপ এবং সেটার মডেল এখানে দেখা যাচ্ছেনা, কারন এটা অটোমেটিক ভাবে দেখা যায়না বরং এডমিনে মডেল এড করে নিতে হবে।

আমাদের myapp অ্যাপ এর ভিতর দেখবেন admin.py নামে একটা মডিউল আছে, সেটা ওপেন করুন! ভিতরে এরকম কোড দেখা যাবেঃ

from django.contrib import admin

# Register your models here.

আপনি সেখানে আপনার আপনার মডেল ক্লাসটি ইম্পোর্ট করুন, অতপর সেটা রেজিস্টার করুন। আপনার admin.py এর সম্পুর্ন কোড এরকম হবেঃ

from django.contrib import admin

# Register your models here.
from myapp.models import Message # মডেল ইম্পোর্ট করা হল

admin.site.register(Message) # মডেলকে এডমিন সাইটে রেজিস্টার করা হল

এখন আবার ব্রাউজারে এডমিন প্যানেলে যান, এরকম দেখা যাবেঃ

আমাদের এপটি এখন এডমিন প্যানেলে দেখা যাচ্ছে, লক্ষ্য করুন, এপ এর নামটি বড় হাতের অক্ষরে লেখা MYAPP এবং তার নিচে সেই এপ এর Message মডেলটির নাম দেখা যাচ্ছে, তার পাশে Add এবং Change নামে দুটি বাটন দেখা যাচ্ছে!

এখন আপনি যদি Message লেখাটিতে ক্লিক করেন তাহলে মেসেজ মডেলের অবজেক্টগুলো দেখতে পাবেনঃ

আমাদের তৈরি তিনটি অবজেক্ট (জ্যাঙ্গো শেলে তৈরি করেছিলাম! মনে আছে?) সুন্দর ভাবে দেখা যাচ্ছে। এখন এই অবজেক্টগুলোর উপর ক্লিক করে আমরা কিন্তু এগুলো আমাদের মন মত এডিট করতে পারি, আবার ডিলেটও করতে পারি।

প্রথম থাকা অবজেক্ট অর্থাৎ ‘Are you Crazy !’ মেসেজটায় ক্লিক করে ভিতরে প্রবেশ করুন, এরকম একটা এইচটিএমএল টেক্সট এরিয়া দেখতে পাবেন, যেখানে মেসেজটি এডিট করা যাবেঃ

এটাকে এডিট করে যদি আমরা ‘Hey! Are you Crazy !’ করে সেভ বাটনে ক্লিক করিঃ

তাহলে আমাদের সেই মেসেজটি পরিবর্তন হয়ে যাবে! এভাবে আমরা প্রতিটা অবজেক্টই এডিট করতে পারি।

এডমিন প্যানেলের মাধ্যমে আমরা যেকোনো অবজেক্টকেই (উপরের উদাহরনের অবজেক্টে শুধু টেক্সট ছিল, কিন্তু আমরা আরো কমপ্লেক্স কোনো অবজেক্টকেও) ক্রিয়েট/রিড/আপডেট/ডিলেট করতে পারব!

আপনার কাজ হল এডমিন প্যানেলটা আরো ভালো করে ঘুরে দেখা, এই চ্যাপ্টারে আমরা শুধু অবজেক্ট রিড এবং আপডেট করা দেখেছি। আপনি নিজেই চেষ্টা করুন কিভাবে এডমিন প্যানেলের মাধ্যমে নতুন অবজেক্ট/ডাটা (আমাদের এপ এর ক্ষেত্রে ‘মেসেজ’) তৈরি করা যায়! এবং কিভাবে কোন অবজেক্ট/ডাটা ডিলেট করা যায়।

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

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

মডেল তৈরি

আমাদের লক্ষ্য হল, কেউ যদি আমাদের ওয়েবসাইটে আসে তাহলে তাকে শুধু Hello World! না দেখিয়ে এর সাথে একটা মেসেজও দেখাবো। আমরা কয়েকটি টেক্সট মেসেজ ডাটাবেইজে সেভ করে রাখব, আর ভিজিটরকে র‍্যান্ডম ভাবে একেক সময় একেকটা মেসেজ দেখাব। যেমন Hello World! Today is Beautiful Day! অথবা Hello World! Nice To Meet You!

এই মেসেজগুলো লিখতে হলে আমাদেরকে ডাটাবেইজে একটা টেবিল তৈরি করতে হবে, টেবিল তৈরি করতে প্রথমে আপনার অ্যাপ (myapp) ফোল্ডারের models.py ফাইলটি কোন টেক্সট এডিটরে ওপেন করুন। সেখানে এরকম দুটি লাইন দেখা যাবে।

from django.db import models

# Create your models here.

প্রথম লাইনে models মডিউল ইম্পোর্ট করা হয়েছে। ওআরএম চ্যাপ্টারে আমরা বলেছি যে ডাটাবেইজের টেবিল/কলাম তৈরি করব অবজেক্ট অরিয়েন্টেড কোড দিয়ে, অর্থাৎ ক্লাস লিখে। আমাদের একেকটা টেবিল হবে একেকটা ক্লাস, ক্লাসের এট্রিবিউট গুলো হবে টেবিলের কলাম! আর হ্যা, আমাদের সকল মডেল ক্লাসগুলোই উপরে ইম্পর্ট করা models.Model এর সাবক্লাস হবে।

ব্যপারটা কঠিন লাগছে? আসুন কোডে চলে যাই, আমাদের সাইটের মেসেজ গুলো রাখার জন্য প্রথমে আমরা Message নামে একটা ক্লাস তৈরি করব, models.py ফাইলে (# Create your models here. কমেন্টটার পর) লিখুনঃ

class Message(models.Model):

আমরা Message নামে ক্লাস তৈরি করলাম, এটাকেই আমাদের ডাটাবেইজ টেবিল হিসেবে ধরে নিতে পারেন, আমাদের ক্লাসটি models.Model এর সাবক্লাস করলাম, এতে আমাদের ক্লাসে প্রয়োজনীয় কিছু এট্রিবিউট/মেথড যুক্ত হবে।

এর পর লিখুনঃ

text = models.TextField()

আমরা text নামে একটা এট্রিবিউট লিখলাম, যার ভ্যালু হল models.TextField অবজেক্ট! TextField দ্বারা বোঝাচ্ছে যে ডাটাবেইজে এই কলামের ফিল্ড/রো গুলো টেক্সট টাইপের হবে, পাইথনের স্ট্রিং গুলোই ডাটাবেইজ টেক্সট হিসেবে থাকবে।

মাথা গরম করার দরকার নেই, এটা ওআরএম এর সুবিধা/বৈশিষ্ট! উপরের কোডটির বাংলা অনুবাদটা মোটামোটি এরকমঃ

‘ওহে ডাটাবেইজ, তুমি Message নামক টেবিলে text নামে একটা কলাম তৈরি কর, যে কলামটাতে রো/ফিল্ড হিসেবে টেক্সট/স্ট্রিং টাইপ ভ্যালু থাকবে’

এর পর আমাদেরকে str() ম্যাজিক মেথড ওভাররাইট করতে হবেঃ

def __str__(self):
    return self.text

বুঝতেই পারছেন, এই মেথডের কারনে এখন Message ক্লাসের অবজেক্টগুলোকে print করলে সেই অবজেক্টের text ফিল্ডের ভ্যালু দেখা যাবে!

আমাদের Message মডেল তৈরি হয়ে গেল। একনজরে models.py ফাইলঃ

from django.db import models

# Create your models here.
class Message(models.Model):
    text = models.TextField()

    def __str__(self):
        return self.text  

মডেল তৈরি হল, ডাটাবেইজ কিন্তু এখনো তৈরি হয়নি… এই মডেল অনুযায়ী ডাটাবেইজ তৈরি করতে আমাদেরকে manage.py ফাইলের দুটি কমান্ড এর সাথে পরিচিত হতে হবে।

makemigrations – প্রতিবারই আপনি কোন মডেল তৈরি করলে অথবা মডেলের কোন ফিল্ড (এট্রিবিউট) পরিবর্তন করলে আপনাকে কমান্ড প্রম্পট বা টার্মিনালে

python manage.py makemigrations
কমান্ডটি দিতে হবে। এতে করে আপনার অ্যাপ ফোল্ডারে (আমাদের myapp ফোল্ডারে) থাকা migrations ফোল্ডারে একটি মাইগ্রেশন নাম্বার যুক্ত পাইথন ফাইল তৈরি হবে। সেই ফাইলের ভিতরে যে কোডগুলো থাকবে সেটা আসলে আপনার ডাটাবেইজ এর সিকুয়েল কোড কেমন হবে তারই একটা প্রতিরূপ! এর উপর ভিত্তি করেই আপনার ডাটাবেইজ টেবিল/কলাম/ডাটা তৈরি হবে। আপনি সিকুয়েল ভালো পারলে এখানে আপনার চাহিদা অনুযায়ী পরিবর্তন করতে পারবেন। মাইগ্রেশনের উল্লেখযোগ্য আরেকটা সুবিধা হল, প্রতিবার মডেল আপডেট করে makemigrations কমান্ড দিলে প্রতিবারই migrations ফোল্ডারে নতুন একটা ফাইল তৈরি হয়, যেটা ভার্শন কন্ট্রোল করাতে খুবই কাজের, অর্থাৎ আপনি যদি ভুলে ডাটাবেইজ আপডেট করেন তাহলে ব্যাক করে আগের অবস্থায় ফিরে যেতে পারবেন। makemigrations কমান্ড দেয়ার পরও কিন্তু আপনার ডাটাবেইজ তৈরি হয়নি, আসল ডাটাবেইজ তৈরি হবে migrate কমান্ড দিলে।

migrate- মাইগ্রেশন তৈরি করার পর তা অনুযায়ী ডাটাবেইজ তৈরি করতে
python manage.py migrate 

কমান্ডটি দিতে হবে। এটাই আপনার ডাটাবেইজ তৈরি/আপডেট করে দিবে।

লক্ষ্য করুন, প্রতিবার models.py তে মডেল যুক্ত বা আপডেট করলে ডাটাবেইজে সেটা ইমপ্লিমেন্ট করতে টার্মিনালে python manage.py makemigrations এবং python manage.py migrate কমান্ড দুটি দিতে হবে। makemigrations কমান্ড কিন্তু ডাটাবেইজ তৈরি/আপডেট করেনা, শুধু একটা মাইগ্রেশন ফাইল তৈরি করে। এরপর migrate কমান্ডটা সেই মাইগ্রেশনের উপর ভিত্তি করে আসল ডাটাবেইজ তৈরি/আপডেট করে। আমাদের মডেল তৈরি হল এবং ডাটাবেইজও রেডি হয়ে গেলে… এখন ডাটাবেইজে ডাটা রাখতে হবে… এখন পরিচিত হওয়ার সময় এসেছে জ্যাঙ্গো শেল এর সাথে… জ্যাঙ্গো শেল… নাম শুনে কি ভয় লাগছে !!??

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

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

আমরা মডেল তৈরি করেছি, সেই মডেলে কিছু ডাটা/ফিল্ড তৈরি করেছি, এখন আমরা সেই ডাটাগুলো ভিউ এর মাধ্যমে প্রকাশ করব, যাতে কেউ আমাদের ওয়েবসাইটে () গেলে সেই ডাটাগুলো দখতে পায়।

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

from django.shortcuts import render, HttpResponse

# Create your views here.
def index(request):
    return render(request, 'index.html')

উক্ত ভিউটা রেসপন্স হিসেবে শুধুমাত্র ‘index.html’ ফাইলটা রেন্ডার করে পাঠিয়ে দিচ্ছে! অন্য কোন কাজ করছেনা। এটাকে আমাদের মন মত কাজ করাতে প্রথমে models.py থেকে Message মডেলটা ইম্পোর্ট করুনঃ

from models import Message তারপর index ভিউ ফাংশন এর ভিতর মডেল ম্যানেজার ব্যবহার করে Message এর সবগুলো ফিল্ড একটা ভ্যারিয়েবলে রাখুনঃ

all_messages = Message.objects.all()

সবগুলো মেসেজ এখন all_messages ভেরিয়েবলে আছে।

সর্বশেষ যেটা করতে হবে, এই ভেরিয়েবলটাকে ‘index.html’ টেমপ্লেট এর ভিতর পাঠিয়ে দিতে হবে! এর ফলে আমরা টেমপ্লেট থেকেই all_messages এর ভ্যালু এক্সেস করতে পারব।

এটা করার জন্য render() ফাংশন এর তৃতীয় প্যারামিটার হিসেবে একটা ডিকশনারি পাস করতে হবে, যার ‘কী’ হবে একটা স্ট্রিং, এবং ভ্যালু হবে all_message ভেরিয়াবল।

return render(request, 'index.html', {'messages': all_messages})

আমরা ডিকশনারির ‘কী’ হিসেবে ‘messages’ স্ট্রিং দিয়েছি। টেমপ্লেটে আমরা all_messages ভেরিয়েবল এক্সেস করার জন্য এই messages ‘কী’ টাকেই ব্যবহার করব!

আমাদের সম্পুর্ন views.py এর কোড দেখতে এরকম হবেঃ

from django.shortcuts import render, HttpResponse

from models import Message

# Create your views here.
def index(request):
    all_messages = Message.objects.all()
    return render(request, 'index.html', {'messages': all_messages})

ভিউ এর কাজ শেষ! এখন টেমপ্লেট এর কাজ শুরু করতে হবে, মেসেজ এর সবগুলো অবজেক্ট সহ যে ভেরিয়েবলটা টেমপ্লেটে পাঠানো হল তা সুন্দর ভাবে শো করার জন্য আমাদেরকে আরেকটু গভীর ভাবে জ্যাঙ্গো টেমপ্লেট ল্যাঙ্গুয়েজ এর সাথে পরিচিত হতে হবে… চলুন তাহলে!

টেমপ্লেট ট্যাগ এবং ফিল্টার

জ্যাঙ্গো টেমপ্লেট ল্যাঙ্গুয়েজ (DTL) একদম এইচটিএমএল এর মতই! তবে তাতে অতিরিক্ত কিছু সুবিধা পাওয়া যায়! উল্লেখযোগ্য সুবিধাগুলো হলঃ

১) টেমপ্লেট ইনহেরিটেন্স! পাইথনে আমরা যেভাবে এক ক্লাস থেকে আরেক ক্লাস কে ইনহেরিট করি, টেমপ্লেট ল্যাঙ্গুয়েজেও সেরকমটা করা যায়, একটা বেজ টেমপ্লেট তৈরি করে সেটা যেকোনো চাইল্ড টেমপ্লেটে ইনহেরিট করে নেয়া যায়!

২) টেমপ্লেট ইনক্লুডিং! যদি টেমপ্লেট বড় হয়ে যায় সেটাকে আমরা বিভিন্ন ফাইলে বিভক্ত করে যেকোন একফাইলে ইনক্লুড করে নিতে পারি! উদাহরণস্বরূপ, আমরা টেমপ্লেট এর হেডার, ফুটার, সাইডবার, ন্যাভম্যানু বার, স্লাইডার ইত্যাদি আলাদা আলাদা ফাইলে লিখতে পারি এবং সেগুলোকে হোম পেইজ বা অন্য কোন পেইজে ইনক্লুড করে দিতে পারি। এতে বারবার কোড করা থেকে মুক্তি পাওয়া যাবে এবং কোড ওয়েল অর্গানাইজড থাকবে।

টেমপ্লেট ইনক্লুড করা এবং টেমপ্লেট ইনহেরিট করা নিয়ে প্রথম প্রথম কনফিউশন লাগতে পারে, দুটোকে প্রায় এক মনে হলেও তাদের মধ্যে কিন্তু অনেক পার্থক্য আছে!

৩) টেমপ্লেট ট্যাগ ব্যবহার! ট্যাগ এর মাধ্যমে আমরা পাইথনের কমন কিছু ফাংশনালিটি সরাসরি টেমপ্লেটেই ব্যবহার করতে পারি! যেমন ইফ/এলস কন্ডিশন চেক করা, ফরলুপ চালানো, ফাংশন কল করা, ভেরিয়েবল কল করা ইত্যাদি বিষয়গুলো ট্যাগ দিয়ে করা যায়!

৪) টেমপ্লেট ফিল্টার! এটাকে পাইথনের ফাংশন বা মেথডের সাথে তুলনা করা যায়, ফিল্টার মুলত টেমপ্লেট ট্যাগের উপর ব্যবহার করা হয় সেই ট্যাগের ভ্যালুতে নির্দিষ্ট কিছু পরিবর্তন করার জন্য। যেমন কোনো স্ট্রিংকে আপারকেস করা, ডেটটাইমকে হিউম্যান রিডেবল করা, কোন টেমপ্লেট ট্যাগ এর ডিফল্ট মান দেয়া ইত্যাদি কাজ গুলো ফিল্টার দিয়ে করা যায়।

আগের চ্যাপ্টারে ভিউ থেকে আমরা একটি ভেরিয়েবলকে টেমপ্লেটে পাস করেছিলাম যেটা messages ‘কী’ এর মাধ্যমে এক্সেস করা যাবে, সে ভেরিয়েবল এর ভ্যালুগুলো এখন আমরা টেমপ্লেট ট্যাগ এর মাধ্যমে শো করব।

Myapp এপ এর ভিতরের templates ফোল্ডারে থাকা index.html ফাইলটি ওপেন করুন (ডিরেক্টরিঃ myproject\myapp\templates ), সেটার কোডগুলো এরকম ছিলঃ

<!DOCTYPE html>
<html>
    <head>
        <title>My view</title>
    <head>
    <body>
        <h1>Hello World!</h1>
    </body>
<html>

এখানে <h1>Hello World!</h1> এর নিচে লিখুনঃ

{% for message in messages %}
    <p> {{ message.text }} </p>
{% endfor %}

খেয়াল করে দেখুন, এটা কিন্তু একটা ফরলুপ! পাইথনের ফরলুপের মতই, শুধু দুটি পার্থক্যঃ ১) ফরলুপটিকে আমরা `

এরকম বন্ধনির ভিতর রেখেছি! এটা হল ট্যামপ্লেট ট্যাগে এর সিন্ট্যাক্স, ফরলুপ, ফাংশন কল, কন্ডিশন চেক ইত্যাদি কাজগুলো করতে হলে সেগুলোকে এই বন্ধনির ভিতর রাখতে হবে। ২) তিন নাম্বার লাইনে দেখুন

` ট্যাগ দিয়ে আমরা ফরলুপ ব্লক এর শেষ বুঝিয়েছি, পাইথনে যেমন ইন্ডেন্টেশন ব্লক দিয়ে ফরলুপ বা অন্যান্য কোড ব্লগ বোঝানো হয়, ট্যামপ্লেট ল্যাঙ্গুয়েজে যেহেতু ইন্ডেন্টেশন বাধ্যতামুলক নয় তাই এখানে স্পষ্ট ভাবে কোডব্লক এর শেষ উল্লেখ করে দিতে হবে!

মধ্যবর্তি লাইনটাতে এইচটিএমএল এর <p> </p> ট্যাগে এর ভিতর {{ message.text }} লিখে আমরা message এর text ফিল্ডকে কল করছি। এটা ট্যামপ্লেট ট্যাগ এর আরেক সিন্ট্যাক্স, কোন ধরনের ভেরিয়েবলকে কল করতে চাইলে {{ }} এরকম বন্ধনির ভিতর তা লিখতে হবে!

তো আমাদের index.html ফাইলের সম্পুর্ন কোডটি এখন এরকমঃ

<!DOCTYPE html>
<html>
    <head>
        <title>My view</title>
    <head>
    <body>
        <h1>Hello World!</h1>

        {% for message in messages %}
            <p> {{message.text}} </p>
        {% endfor %}

    </body>
<html>

এখন কমান্ড লাইন থেকে আবার ডেভেলপমেন্ট সার্ভার চালু করুন এবং ব্রাউজারে এই ঠিকানায় যানঃ

http://127.0.0.1:8000/myview/

দেখবেন আমাদের তৈরি করা তিনটি মেসেজ সুন্দর ভাবে শো করছেঃ

এক নজরেঃ যখনই আমরা ব্রাউজেরে http://127.0.0.1:8000/myview/ ইউআরএল লিখে এন্টার চাপছি তখন ব্রাউজার আমাদের সার্ভারে একটা রিকুয়েস্ট পাঠাচ্ছে, তারপর আমাদের সার্ভারে থাকা জ্যাঙ্গো সেই ইউআরএল টাকে urls.py ফাইলে থাকা ইউআরএল গুলোর সাথে মিলিয়ে দেখছে যে এই ইউআরএল এর সাথে সংযুক্ত কোন ভিউ আছে কিনা! যখন সে এটার সাথে index() ভিউ এর ম্যাচ পেল সাথে সাথে index() ভিউকে কল করল। index() ভিউ প্রথমে Message মডেলের অবজেক্টগুলোকে নিয়ে আসল এবং সেটাকে ট্যামপ্লেট এর মাধ্যে রেন্ডার করতে দিল, ট্যামপ্লেটে অবজেক্টগুলো ঠিক মত রেন্ডার হয়ে গেলে index() ভিউটি সেটাকে রেসপন্স হিসেবে ব্রাউজারে পাঠিয়ে দিল আর আমরা ব্রাউজের আমাদের কাঙ্ক্ষিত ফলাফল দেখতে পেলাম!

ইউআরএল কনফিগারেশন ইন ডেপথ

আমাদের myapp এর ভিউগুলো এক্সেস করতে যে ইউআরএল ভিজিট করতে হয় সেগুলো আমরা myproject প্রোজেক্ট ফোল্ডার এর ভিতরের urls.py তে রেখেছি! এবং আমরা আগেই জেনেছি যে জ্যাঙ্গোতে প্রোজেক্টগুলো ছোট ছোট এপ এ ভাগ করা থাকে, আমাদের প্রোজেক্টে যদিও এখন পর্যন্ত একটা মাত্র এপ আছে, কিন্তু প্রোজেক্ট বড় হলে সেখানে অনেকগুলো এপ তৈরি করতে হয়।

এখন সবগুলো এপস এর ইউআরএল গুলো যদি সেই মেইন প্রোজেক্ট ফোল্ডারের ulrs.py তে রাখি তাহলে ফাইলটা অনেক বড় এবং বিদঘুটে হয়ে যাবে! এটাই কি ভাল না যে আমরা প্রতিটা এপ এর ইউআরএল কনফিগারেশন সেই এপ ফোল্ডারের এর ভিতরেই রাখব!? তাহলে কোডগুলো আরো অর্গানাইজড এবং রিইউজএবল হবে!

একাজটি করা খুবই সোজা, প্রথমে এপ ফোল্ডারের ভিতর urls.py নামে একটা ফাইল তৈরি করুনঃ

তারপর সেটা টেক্সট এডিটরে ওপেন করুন, এবং নিচের কোডগুলো লিখুনঃ

from django.conf.urls import url

from myapp.views import index

urlpatterns = [
    url(r'^$', index),
]
  • প্রথমে আমরা url ফাংশনটি ইম্পোর্ট করেছি।

  • তারপর আমাদের ভিউ ফাইল থেকে index() ভিউ ফাংশন ইম্পোর্ট করেছি।

  • তারপর urlpatterns নামের একটা লিস্টে url ফাংশনটি কল করেছি, যার প্রথম প্যারামিটার হিসেবে আছে r’^$’ রেগুলার এক্সপ্রেশন, যেটা আসলে ফাকা স্ট্রিং এর সাথে ম্যাচ করবে (অর্থাৎ ইউআরএল এ কোন স্ট্রিং বা ভ্যালু থাকলে সেটা ম্যাচ করবেনা)

এখন myproject প্রোজেক্ট ফোল্ডারে থাকা urls.py ফাইল ওপেন করুন, সেখানে এরকম কোড থাকবেঃ

# উপরের কমেন্টগুলো বাদ দেয়া হয়েছে
from django.conf.urls import url
from django.contrib import admin

from myapp.views import index

urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'^myview/', index),
]

এটাকে মডিফাই করে এরকম করুনঃ

from django.conf.urls import url, include
from django.contrib import admin

urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'^myview/', include('myapp.urls'),
]
  • প্রথম লাইনে আমরা url এর সাথে include নামে একটা ফাংশন ইম্পোর্ট করেছি।

  • myapp.views থেকে যে index() ভিউ ইম্পোর্ট করা ছিল সেটা রিমোভ করেছি, সেটা এখানে আর দরকার নেই।

  • urlpatterns লিস্টের দ্বিতীয় আইটেমটিতে url ফাংশনে আমরা include(‘myapp.urls’) দিয়ে এটা বুঝিয়েছি যে যখনই কোনো রিকুয়েস্টকৃত ইউআরএল এর প্রথম অংশ r’^myview/’ এর সাথে ম্যাচ করবে তখন সে ইউআরএল এর বাকি অংশ ম্যাচ করার জন্য ‘myapp.urls’ ফাইলটা এখানে ইনক্লুড করে নিবে!

বিষয়টা একটু কঠিন হয়ে গেল!? আবার বলি, ধরুন আমরা ব্রাউজারে http://127.0.0.1:8000/myview/ লিখে এন্টার চাপলাম!

  • ব্রাউজার থেকে সার্ভারে রিকুয়েস্ট আসল, জ্যাঙ্গো উক্ত ইউআরএল টি myproject ফোল্ডারের urls.py তে থাকা urlpatterns লিস্টের ইউআরএল গুলোর সাথে মিলিয়ে দেখলো কোনটা মিলে!,

  • দ্বিতীয় প্যাটার্নটা উক্ত ইউআরএল এর প্রথম অংশ myview/ এর সাথে মিলল,

  • জ্যাঙ্গো এখন উক্ত ইউআরএল এর myview/ এর পরের অংশ মিলানোর জন্য myapp.urls এ থাকা urlpatterns লিস্টের সাথে ম্যাচ করা শুরু করল!,

  • যেহেতু myview/ এর পরের অংশ ফাঁকা বা সেখানে যেহেতু কিছুই নেই তাই সেটা r'^$' রেজেক্স এর সাথে ম্যাচ করল এবং তার সাথে থাকা index ভিউ কল হল।

  • অতঃপর ভিউ তার কাজ শেষে রেসপন্স পাঠিয়ে দিল!

মনে রাখবেনঃ জ্যাঙ্গো ইউআরএল ম্যাচ করে ডোমেইন নেম বাদ দিয়েঃ http://127.0.0.1:8000/myview/ এর ক্ষেত্রে শুধু myview/ টুকু ম্যাচ করা হবে http://127.0.0.1:8000/ অংশটা বাদ দেয়া হবে। রিকুয়েস্ট করা যেকোন ইউআরএল এর শেষে যদি স্ল্যাশ ‘/’ না থাকে তাহলে জ্যাঙ্গো অটোমেটিক সেখানে একটা স্ল্যাশ যুক্ত করে দেয়, তাই http://127.0.0.1:8000/myview এ রিকুয়েস্ট করলেও সেটা http://127.0.0.1:8000/myview/ হিসেবে দেখা হবে।

Similar Posts

Leave a Reply

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