# স্বতন্ত্র টিউটোরিয়াল ১

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

ইনস্টলেশন ধাপে আমরা দেখেছি ভার্সন নির্নয় করতে 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`: এটি হলো জ্যাঙ্গোর কমান্ড লাইন টুলগুলোর মধ্য একটি । এটি ব্যবহার করে আমরা প্রজেক্ট সম্পর্কিত নানাবিধ কাজ করতে পারি ।&#x20;
* ভিতরের `mysite` ডিরেক্টরিটাই আমাদের মূল অ্যাপ্লিকেশন যেটি কিনা আসলে একটি পাইথন প্যাকেজ যার ভিতরে আমাদের অ্যাপ্লিকেশনের মৌলিক কিছু কনফিগারেশন আমরা সংরক্ষন করবো ।&#x20;
* ‍‍‍`mysite/__init__.py‍`: আমরা জানি `__init__.py` সাধারণত একটি ফাকা ফাইল হয় যেটা নির্দেশ করে যে এই ডিরেক্টরিটি আসলে একটি পাইথন প্যাকেজ । সাধারণ ডিরেক্টরি এবং পাইথন প্যাকেজের পার্থক্য করার জন্য এটি বেশ কাজের ।&#x20;
* `mysite/settings.py`: অ্যাপ্লিকেশনের সেটিংসগুলো এই ফাইলে রাখি আমরা ।&#x20;
* ‍`mysite/urls.py`: এই ফাইলে থাকে এই অ্যাপ্লিকেশনের সকল URL এর সংজ্ঞা । এই ফাইলেই আমরা জ্যাঙ্গোকে বলে দেই কোন URL কিভাবে হ্যান্ডল করবো আমরা ।
* `mysite/wsgi.py`: এই ফাইলটি WSGI কম্প্যাটিবল সার্ভার ব্যবহার করার সময় কাজে লাগে । এই ফাইলের কেরামতি আমরা যখন ডেপ্লয়মেন্ট নিয়ে আলোচনা করবো তখন দেখবো ।&#x20;

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

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

```
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` হলো ডাটাবেইজ ড্রাইভারের নাম ।&#x20;
* `NAME` হলো ডাটাবেইজের নাম । SQLite এর বেলায় ফাইলের নাম ।&#x20;
* `USER` ডাটাবেইজের ইউজার নেইম ।&#x20;
* ‍`PASSWORD` হলো পাসওয়ার্ড ।
* `HOST` হচ্ছে ডাটাবেইজ সার্ভার যে হোস্টে রান করছে তার নাম । লোকাল মেশিনের হোস্টনেম হবে `localhost` । উহ্য রাখলে জ্যাঙ্গো লোকালহোস্টই ব্যবহার করবে ।&#x20;
* `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` সেকশনে বলেছি একটি প্রজেক্ট হলো এক বা একাধিক অ্যাপ্লিকেশনের সমষ্টি । একটি জ্যাঙ্গো সাইট বা প্রজেক্ট এর ওভার অল ফাংশনালিটি আমরা ছোট ছোট ইউনিটে ভাগ করে ফেলি । এরপর প্রত্যেকটি ভিন্ন ভিন্ন ফিচারের জন্য আমরা আলাদা আলাদা অ্যাপ্লিকেশন ডেভেলপ করি । একটু ব্যখ্যা করি, ধরুন আপনি একটি কমিউনিটির জন্য সাইট ডেভেলপ করছেন । আপনার প্রয়োজন পড়বে -

* ব্লগ&#x20;
* ফোরাম
* ফটো বা ভিডিও গ্যালারি&#x20;

জ্যাঙ্গোতে আমরা প্রতে্যকটি ফাংশনের জন্য আলাদা আলাদা অ্যাপ্লিকেশন তৈরি করবো । এতে লাভ - একই ধরণের কাজ করে এমন সব কোড এক জায়গায় থাকছে, এই অ্যাপ্লিকেশনটি চাইলে আপনি অন্য আরেকটি প্রজেক্ট এও ব্যবহার করতে পারছেন খুব সহজে । জ্যাঙ্গোর অ্যাপ্লিকেশনগুলো অনেকটা প্লাগ অ্যান্ড প্লে ধাচেঁর । আপনি শুধু মূল অ্যাপ্লিকেশনের `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` নির্দেশ করে যে ডিরেক্টরীটি একটি পাইথন প্যাকেজ&#x20;
* `models.py` এ আমরা আমাদের প্রয়োজনীয় ডাটা মডেল তৈরি করবো&#x20;
* `tests.py` এ আমরা ইউনিট টেস্টিং এর জন্য টেস্ট কেইসগুলো রাখবো
* `views.py` গতানুগতিক MVC ফ্রেমওয়ার্ক থেকে জ্যাঙ্গো একটু ভিন্ন । জ্যাঙ্গোতে Controller এর পরিবর্তে আমরা View ব্যবহার করি । এই ফাইলে আমরা সেই ভিউগুলো তৈরি করবো ।&#x20;

## MVC vs MTV

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

* `Models`: ডাটা মডেল&#x20;
* `View`: ব্যবহারকারীরা যা দেখে । সাধারণত HTML, CSS, JS থাকে ।&#x20;
* `Controller`: বিজনেস লজিক থাকে । কন্ট্রোলার মডেল থেকে ডাটা নিয়ে ভিউ এর সাথে সমন্বয় করে ।&#x20;

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

* `Model` এর জায়গায় `Model` ই থাকছে&#x20;
* `View` এর কাজটা জ্যাঙ্গোতে করছে `Template`
* `Controller` এর জন্য আছে `View`&#x20;

জ্যাঙ্গোর `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() \[]

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


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://django.howtocode.dev/1.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
