Have an account? Sign in

নতুন প্রজেক্ট তৈরি করা

ইনস্টলেশন ধাপে আমরা দেখেছি ভার্সন নির্নয় করতে django-admin.py টুলটির ব্যবহার । এখন আমরা এই টুলটি ব্যবহার করবো নতুন একটি প্রজেক্ট তৈরি করতে । টার্মিনালে এই কমান্ডটি ব্যবহার করুন -

django-admin.py startproject mysite

এটা mysite নামে একটা ডিরেক্টরী তৈরি করবে । চলুন দেখে নেই mysite ডিরেক্টরীর স্ট্রাকচার কেমন হলো -

mysite/
manage.py
mysite/
__init__.py
settings.py
urls.py
wsgi.py

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

এবার আসুন এই ডিরেক্টরী এবং ফাইলগুলোর পরিচিতি জেনে নেই -

  • একেবারে বাইরের mysite ডিরেক্টরীটি আসলে আমাদের মূল প্রজেক্ট ডিরেক্টরী । এটার নাম আসলে কোন ব্যাপার না ।

  • manage.py: এটি হলো জ্যাঙ্গোর কমান্ড লাইন টুলগুলোর মধ্য একটি । এটি ব্যবহার করে আমরা প্রজেক্ট সম্পর্কিত নানাবিধ কাজ করতে পারি ।

  • ভিতরের mysite ডিরেক্টরিটাই আমাদের মূল অ্যাপ্লিকেশন যেটি কিনা আসলে একটি পাইথন প্যাকেজ যার ভিতরে আমাদের অ্যাপ্লিকেশনের মৌলিক কিছু কনফিগারেশন আমরা সংরক্ষন করবো ।

  • ‍‍‍mysite/__init__.py‍: আমরা জানি __init__.py সাধারণত একটি ফাকা ফাইল হয় যেটা নির্দেশ করে যে এই ডিরেক্টরিটি আসলে একটি পাইথন প্যাকেজ । সাধারণ ডিরেক্টরি এবং পাইথন প্যাকেজের পার্থক্য করার জন্য এটি বেশ কাজের ।

  • mysite/settings.py: অ্যাপ্লিকেশনের সেটিংসগুলো এই ফাইলে রাখি আমরা ।

  • mysite/urls.py: এই ফাইলে থাকে এই অ্যাপ্লিকেশনের সকল URL এর সংজ্ঞা । এই ফাইলেই আমরা জ্যাঙ্গোকে বলে দেই কোন URL কিভাবে হ্যান্ডল করবো আমরা ।

  • mysite/wsgi.py: এই ফাইলটি WSGI কম্প্যাটিবল সার্ভার ব্যবহার করার সময় কাজে লাগে । এই ফাইলের কেরামতি আমরা যখন ডেপ্লয়মেন্ট নিয়ে আলোচনা করবো তখন দেখবো ।

ডেভেলপমেন্ট সার্ভার চালু করা

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

python manage.py runserver

আউটপুট হবে নিচের মত -

Validating models...
0 errors found
May 24, 2013 - 15:50:53
Django version 1.5, using settings 'mysite.settings'
Development server is running at http://127.0.0.1:8000/
Quit the server with CONTROL-C.

আমরা যদি http://127.0.0.1:8000/ অ্যাড্রেসটি আমাদের ব্রাউজারে প্রবেশ করাই তবে আমরা জ্যাঙ্গোর হোম পেইজটি দেখতে পাবো ।

পুনশ্চ: আমরা চাইলে খুব সহজেই সার্ভারের পোর্ট বদল করতে পারি । যেমন আমরা যদি চাই সার্ভারটি 8080 পোর্টে রান করুক তবে আমরা runserver কমান্ডটি ব্যবহার করবো সাথে অতিরিক্ত পোর্ট নাম্বারটি দিয়ে দিবো -

python manage.py runserver 8080

ডাটাবেইজ সেটাপ করা

আমরা যদি ‍mysite/settings.py ফাইলটি টেক্সট এডিটরে খুলি তবে দেখবো ডাটাবেইজ এর জন্য একটি আলাদা সেকশন আছে ।

DATABASES = {
'default': {
'ENGINE': 'django.db.backends.', # Add 'postgresql_psycopg2', 'mysql', 'sqlite3' or 'oracle'.
'NAME': '', # Or path to database file if using sqlite3.
# The following settings are not used with sqlite3:
'USER': '',
'PASSWORD': '',
'HOST': '', # Empty for localhost through domain sockets or '127.0.0.1' for localhost through TCP.
'PORT': '', # Set to empty string for default.
}
}

এখানে -

  • ENGINE হলো ডাটাবেইজ ড্রাইভারের নাম ।

  • NAME হলো ডাটাবেইজের নাম । SQLite এর বেলায় ফাইলের নাম ।

  • USER ডাটাবেইজের ইউজার নেইম ।

  • PASSWORD হলো পাসওয়ার্ড ।

  • HOST হচ্ছে ডাটাবেইজ সার্ভার যে হোস্টে রান করছে তার নাম । লোকাল মেশিনের হোস্টনেম হবে localhost । উহ্য রাখলে জ্যাঙ্গো লোকালহোস্টই ব্যবহার করবে ।

  • PORT ডাটাবেইজ সার্ভার যে পোর্টে চালু আছে । সাধারণত এটির কোন মান দেওয়া লাগে না ।

আমরা একটি পূর্নাঙ্গ উদাহরণ দেখে নেই:

DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'student_database',
'USER': 'root',
'PASSWORD': 'Pa55w0Rd',
'HOST': '',
'PORT': '',
}
}

syncdb - ডাটাবেইজ সিঙ্ক্রোনাইজেশন

ধরে নিচ্ছি আমরা যে ডাটাবেইজ ইনফরমেশন দিয়েছি settings.py এ তা সঠিক । এবার তাহলে ডাটাবেইজ সিঙ্ক্রোনাইজেশন এর পালা । একটি জ্যাঙ্গো সাইট বা প্রজেক্ট অনেকগুলো ছোট ছোট অ্যাপ্লিকেশনের সমন্বয়ে তৈরি হয় । এই অ্যাপ্লিকেশনগুলি settings.py এর INSTALLED_APPS সেকশনে যোগ করা হয় । বাই ডিফল্ট কতগুলো অ্যাপ্লিকেশন যোগ করাই থাকে এই লিস্টে । অনেক অ্যাপ্লিকেশনই ডাটাবেইজে তথ্য সংরক্ষন করে । তাই এদের প্রয়োজন পড়ে টেবিল তৈরি করার । manage.py এর syncdb কমান্ডটি এই কাজটিই করে দেয় আমাদের জন্য । আমরা টার্মিনালে রান করবো -

python manage.py syncdb

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

পুনশ্চ: জ্যাঙ্গো শুধু মাত্র INSTALLED_APPS তালিকায় থাকা অ্যাপ্লিকেশনগুলোর জন্যই টেবিল তৈরি করবে । যে সকল অ্যাপ্লিকেশন আপনার প্রয়োজন সেগুলো যোগ করে syncdb চালান । তবে একবার টেবিল তৈরি করে পরে অ্যাপ্লিকেশন তালিকা থেকে রিমুভ করে দিলেও জ্যাঙ্গো ঐ টেবিল ডাটাবেইজ থেকে রিমুভ করবে না । যেসব অ্যাপ্লিকেশন আপনার দরকার পড়বে না সেগুলো syncdb চালানোর আগেই এই তালিকা থেকে মুছে দেওয়া বা কমেন্ট আউট করাই শ্রেয় ।

প্রজেক্ট vs অ্যাপ্লিকেশন

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

  • ব্লগ

  • ফোরাম

  • ফটো বা ভিডিও গ্যালারি

জ্যাঙ্গোতে আমরা প্রতে্যকটি ফাংশনের জন্য আলাদা আলাদা অ্যাপ্লিকেশন তৈরি করবো । এতে লাভ - একই ধরণের কাজ করে এমন সব কোড এক জায়গায় থাকছে, এই অ্যাপ্লিকেশনটি চাইলে আপনি অন্য আরেকটি প্রজেক্ট এও ব্যবহার করতে পারছেন খুব সহজে । জ্যাঙ্গোর অ্যাপ্লিকেশনগুলো অনেকটা প্লাগ অ্যান্ড প্লে ধাচেঁর । আপনি শুধু মূল অ্যাপ্লিকেশনের settings.py এর INSTALLED_APPS সেকশনে যোগ করে দিবেন, একবার syncdb করবেন এবং তারপর urls.py তে রাউট যোগ বা ইম্পোর্ট করবেন । ব্যাস, কাজ শেষ! এই ধরণের ফ্লেক্সিবিলিটির কারণে জ্যাঙ্গোতে কাজ করতে অনেক মজা এবং সময়ও কম লাগে । বিশাল কমিউনিটির সবাই মিলে এমন হাজার হাজার অ্যাপ্লিকেশন ডেভেলপ করে রেখেছে । আপনার যা প্রয়োজন, সেটি ইনস্টল করে নিন অথবা হালকা পরিবর্তন পরিবর্ধন করে নিজের মত করে ব্যবহার করুন ।

এবার তৈরি করি নিজেদের অ্যাপ্লিকেশন

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

একটা অ্যাপ্লিকেশনের স্ট্রাকচার তৈরি করার জন্য manage.py এর startapp কমান্ডটি ব্যবহার করবো এভাবে -

python manage.py startapp polls

তাহলে আমাদের প্রজেক্ট রুটে আরেকটি ফোল্ডার (আসলে পাইথন প্যাকেজ) তৈরি হবে polls নামে । এবার এটির স্ট্রাকচার দেখে নেই -

polls/
__init__.py
models.py
tests.py
views.py

এখানে -

  • __init__.py নির্দেশ করে যে ডিরেক্টরীটি একটি পাইথন প্যাকেজ

  • models.py এ আমরা আমাদের প্রয়োজনীয় ডাটা মডেল তৈরি করবো

  • tests.py এ আমরা ইউনিট টেস্টিং এর জন্য টেস্ট কেইসগুলো রাখবো

  • views.py গতানুগতিক MVC ফ্রেমওয়ার্ক থেকে জ্যাঙ্গো একটু ভিন্ন । জ্যাঙ্গোতে Controller এর পরিবর্তে আমরা View ব্যবহার করি । এই ফাইলে আমরা সেই ভিউগুলো তৈরি করবো ।

MVC vs MTV

MVC ফ্রেমওয়ার্কের কম্পোনেন্টগুলো হয় এমন -

  • Models: ডাটা মডেল

  • View: ব্যবহারকারীরা যা দেখে । সাধারণত HTML, CSS, JS থাকে ।

  • Controller: বিজনেস লজিক থাকে । কন্ট্রোলার মডেল থেকে ডাটা নিয়ে ভিউ এর সাথে সমন্বয় করে ।

জ্যাঙ্গোতে আমরা MTV (Model, Template, View) প্যাটার্ন ফলো করবো । যদি MVC থেকে সরাসরি অনুবাদ করি তবে -

  • Model এর জায়গায় Model ই থাকছে

  • View এর কাজটা জ্যাঙ্গোতে করছে Template

  • Controller এর জন্য আছে View

জ্যাঙ্গোর View নিয়ে ইনশাআল্লাহ পরবর্তিতে আরো বিস্তারিত আলোচনা থাকবে ।

ডাটা মডেলিং - মডেল তৈরি করা

জ্যাঙ্গোর দর্শন হচ্ছে অ্যাপ্লিকেশনের ডাটা একটি সেন্ট্রাল মডেলে রাখা । এরপর প্রয়োজন মাফিক এই মডেলের উপর ভিত্তি করে অন্যান্য জিনিসগুলো অটোমেটিক্যালি জেনারেট করা । এই বিষয়ে আরো বিস্তারিত আমরা পরে দেখবো । আপাতত আমাদের ভোটিং অ্যাপ্লিকেশনের জন্য মডেল তৈরি করে নেই । আগেই বলেছি সব মডেল থাকবে অ্যাপ্লিকেশনের models.py তে । সে হিসাবে আমরা polls/models.py ফাইলটি খুলে নিচের কোড টাইপ করি -

from django.db import models
class Poll(models.Model):
question = models.CharField(max_length=200)
pub_date = models.DateTimeField('date published')
class Choice(models.Model):
poll = models.ForeignKey(Poll)
choice_text = models.CharField(max_length=200)
votes = models.IntegerField(default=0)

আপনি যেহেতু পাইথনের পূর্ব ধারণা রাখেন সেহেতু এই কোড বেশ সহজবোধ্যই মনে হবে । মূলকথা হলো জ্যাঙ্গোর একেকটি মডেল হলো একটি ক্লাস যা models.Model ক্লাসের সাবক্লাস । মডেলগুলো ডাটাবেইজের টেবিলকে রিপ্রেজেন্ট করে । ক্লাসের ভ্যারিয়েবল টেবিলের ফিল্ড বা কলামকে নির্দেশ করে । এই ভ্যারিয়েবলগুলোর টাইপ নির্ধারণ করে টেবিলের কলাম বা ফিল্ডের ডাটা টাইপ কি হবে । এই উদাহরণে আমরা দেখলাম CharField যেটা অল্পকিছু ক্যারেক্টার (কিংবা ছোট খাটো স্ট্রিং) ধারণ করে । IntegerField ইন্টিজার (পূর্ন সংখ্যা) এবং DateTimeField দিন তারিখের জন্য ব্যবহার করা হয় । এরকম অনেকগুলো ডিফল্ট ফিল্ড টাইপ জ্যাঙ্গোর models মডিউলে পাওয়া যায় । তবে সবগুলো আমাদের আপাতত না জানলেও চলবে ।

মডেল এর ব্যবহার

মডেল তৈরি করেছি আমরা, এবার এটাকে বাস্তবে ব্যবহার করার পালা । মডেলটি ব্যবহার করতে প্রথমেই আমাদের প্রয়োজন হবে ডাটাবেইজ সিঙ্ক করা । এতে জ্যাঙ্গো আমাদের জন্য প্রয়োজনীয় টেবিল তৈরি করে দিবে । তবে ডাটাবেইজ সিঙ্ক করার জন্য প্রথমেই আমাদের এ্যাপটিকে settings.py এর INSTALLED_APPS এ যোগ করে নিতে হবে:

INSTALLED_APPS = (
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.sites',
'django.contrib.messages',
'django.contrib.staticfiles',
'polls',
)

এবার রান করুন -

python manage.py syncdb

মডেল এর বাস্তবিক ব্যবহার বোঝার জন্য আমরা ইন্টারএ্যাকটিভ শেল ব্যবহার করবো । পাইথনের ইন্টারএ্যাক্টিভ প্রম্পট এর মতই এটি জ্যাঙ্গো এপিআই ব্যবহার করার সুযোগ করে দেয় । এটি চালানোর জন্য আমরা এই কমান্ডটি ব্যবহার করবো -

python manage.py shell

যেই শেলটি চালু হবে সেটিতে আমরা কোড লাইন বাই লাইন কোড লিখে আউটপুট পরখ করবো -

প্রথমেই আমাদের মডেল ক্লাসটি ইম্পোর্ট করে নেই -

from polls.models import Poll, Choice

পেতে চাই সবগুলি Poll -

Poll.objects.all() []

কিন্তু আমরাতো কোন Poll যোগ করিনি এখনো তাই একটি ফাকা লিস্ট পেলাম ।

তাহলে তৈরি করি প্রথম Poll টি -

from django.utils import timezone p = Poll(question="What's new?", pub_date=timezone.now()) p.save()

জ্যাঙ্গো অবজেক্টটি ডাটাবেইজে সেইভ করবে । এবার দেখি অবজেক্টটির নানা এ্যাট্রিবিউটগুলো -

p.id 1 p.question "What's new?" p.pub_date datetime.datetime(2012, 2, 26, 13, 0, 0, 775217, tzinfo=)

এবার দেখি কিভাবে খুব সহজেই এটিকে পরিবর্তন করা যায় -

p.question = "What's up?" p.save()

এবার আবার সবগুলো Poll অবজেক্ট এর তালিকাটি দেখে নেই -

Poll.objects.all() []

এভাবেই আমরা খুব সহজে মডেল তৈরি এবং ব্যববহার করতে পারি । ভবিষ্যতে আমরা মডেলের উপর আরো বিস্তারিত দেখবো ।