বাংলায় জ্যাঙ্গো

১-৬ঃ Template কে Dynamic করা

by , on
January 7, 2017

index.html ফাইলে কিছু কোড লিখে ফেলি

<html> 
    <head></head> 
    <body> 
      <h1>স্বাগতম বাংলায় জ্যাঙ্গো টিউটোরিয়াল এর প্রথম টেমপ্লেট এ </h1>
      <h2>Hello, I am Harun Ur Rashid </h2> 
    </body> 
</html>

আমাদের পেজে Hello, I am Harun Ur Rashid । কিন্তু এটা তো আমরা টেমপ্লেটের মাঝে নিজের হাতে তৈরি করেছি। আমরা এখন চাচ্ছি views.py ফাইলে আমাদের নাম পরিবর্তন করব, স্বয়ংক্রিয় ভাবে টেমপ্লেটেও নাম পরিবর্তন হয়ে যাবে।

পুর্বেই বলেছিলাম যে render()  ফাংশন তিনটি প্যারামিটার গ্রহণ করে, এই তৃতীয় প্যারামিটারটিকে context variable বলে। context variable  হিসেবে Dictionary ব্যাবহার করা হয়। এটা অনেকটা পাইপ লাইনের মত কাজ করে । এই পাইপ লাইনের মাধ্যমে view থেকে template এ ডাটা পাঠানো যায়।

তাহলে আমাদের render() এর রূপ হবে

render(request, ‘index.html’, {} )

এখানে Dictionary টি কে আমরা নিজের মনের মত সাজাতে পারি

{

'name': “Harun Ur Rashid”

'district':”kushtia”

}

এখন view দেখতে হবে,

def home(request):
 	return render(request, 'index.html',{'name':”harun Ur Rashid”,'district':”kushtia”})

আবারও index.html ফাইলকে পরিবর্তন করি,

<html> 
    <head></head> 
    <body> 
      <h1>স্বাগতম বাংলায় জ্যাঙ্গো টিউটোরিয়াল এর প্রথম টেমপ্লেট এ </h1>
      <h2>Hello, I am {{ name }}</h2>
      <h2>My District is: {{ district }}</h2>
    </body>
</html>

আমরা টেমপ্লেট এর মধ্যে {{ }} চিহ্ন ব্যাবহার করেছি। একে জ্যাঙ্গো টেমপ্লেট ইঞ্জিন এর ভাষায় template variable বলা হয় । Variable এর ভ্যালু দেখার জন্য  {{ variable_name }} ব্যাবহার করা হয়।  অর্থাৎ,  Dictionary এর key এর ভ্যালু যদি সাধারন string, number হয় তাহলে {{ key_name }} ব্যাবহার করে লিখতে পারি। কিন্তু Dictionary এর key এর ভ্যালু যদি কন্ডিশন, লুপ ইত্যাদি হয় তাহলে {%  %} চিহ্ন ব্যাবহার করা হয়। একে Template Tag বলা হয়।    এভাবে আমরা ইচ্ছামত Dictionary এর key পরিবর্তন করে টেমপ্লেট এর Value পরিবর্তন করতে পারি ।

Template এ সকল পোষ্ট দেখানোঃ

এখন আমরা দেখব কিভাবে আমাদের এডমিন প্যানেল থেকে তৈরি করা সকল পোষ্ট আমাদের Template দেখানো যায় ।

প্রথমে views.py এর home() ভিউ দেখি। এই ভিউ এর মধ্যে ডাটাবেজে জমা হওয়া সকল পোষ্ট নিয়ে আসব। এরপর ভিউ থেকে টেমপ্লেটে এ পাঠিয়ে দেব।

from django.shortcuts import render
from .models import Post

def home(request):
    all_post = Post.objects.all()
    return render(request, 'index.html')

from .models import Post  দ্বারা আমরা models.py ফাইলের Post  ক্লাসটি views.py ফাইলে import করলাম। আমরা যখন এডমিন প্যানেল থেকে নতুন নতুন Post তৈরি করছিলাম তখন আসলে Post ক্লাসে object তৈরি করছিল। এক একটি পোষ্ট আসলে এক একটি object. তাহলে সকল পোষ্ট আনতে হলে পাইথনের ভাষায় সকল objects নিয়ে আসতে হবে। Post.objects.all() দিলে সকল পোষ্ট লিস্ট আকারে চলে আসবে। এখানে Post হচ্ছে  models.py এর  Post ক্লাস । এখন এই পোষ্ট এর লিস্ট কে একটি variable এর মধ্যে জমা করলাম। আমরা প্রিন্ট করে দেখতে পারি  all_post  এর মধ্যে কি জমা হয়েছে । নিচের লাইনে লিখুন print(all_post)। পেজটি রিলোড দিয়ে টার্মিনালে লক্ষ করি

<QuerySet [<Post: my first post>, <Post: My 2nd post>]>

অর্থাৎ, all_post  একটি QuerySet ( Post.objects.all() কে Query বলে) যার মধ্যে লিস্ট আছে । লিস্টের মধ্যে লক্ষ করি , প্রতিটি পোষ্টের টাইটেল দেখাচ্ছে। model.py এর def __str__() ম্যাথড দ্বারা আমরা এই টাইটেল কে রিটার্ন করতে বলেছিলাম।

আমরা ফর লুপের মাধ্যমে প্রতিটা পোষ্ট আলাদা করে ফেলতে পারি ।

def home(request):
    all_post = Post.objects.all()
    for post in all_post:
        print(post)

    return render(request, 'index.html')

আমাদের Post ক্লাসের মধ্যে title ও description  ফিল্ড আছে। print(post.title), print(post.description) দিয়ে মজা দেখুন। প্রিতিবার কোড পরিবর্তন করার পর পেজ রিলোড দিতে ভোলা চলবে না।

from .models import Post


def home(request):
    all_post = Post.objects.all()
    return render(request, 'index.html', {'all_post_list': all_post})
# index.html

<html>
<head></head>
<body>
    <h1>স্বাগতম বাংলায় জ্যাঙ্গো টিউটোরিয়াল এর প্রথম টেমপ্লেট এ </h1>

    {% for post in all_post_list %}
       {{ post }}
    {% endfor %}
</body>
</html>

পরবর্তী পোষ্ট >>

Uncategorized

১ – ৫ঃ Url এবং Template ব্যাবহার করা

by , on
January 5, 2017

আমরা এতক্ষণে সাইট পরিচালক হিসেবে ব্লগ পোষ্ট করা শিখে ফেলেছি। কিন্তু আমার পোষ্ট তো আমি সবাই কে দেখাতে চাই। এখন আমরা দেখব আমাদের পোষ্ট কিভাবে দর্শকের সামনে পরিবেশন করতে পারি।

একটা উদাহরণ দেয়া যাক। আমরা রেস্টুরেন্ট এ খাবার খেতে গেলে আমাদের সামনে খাবার পরিবেশন করা হয়। এর পেছনে কয়েকটা ধাপ থাকে। প্রথম ধাপে বাজার থেকে মাছ মাংশ চাউল ইত্যাদি কিনে আনা হয়। দ্বিতীয় ধাপে সেগুল রান্না করা হয় এবং তৃতীয় ধাপে আমাদের সামনে পরিবেশন করা হয় মাজাদার খাবার।
আমাদের সাইটেও একই ব্যাপার । আমরা তিনটি ধাপে কাজ করব। প্রথম ধাপে আমরা আমাদের কাঁচামাল গুল সংগ্রহ করব যেটা জমা থাকে এ। দ্বিতীয় ধাপে এই কাঁচামালগুলোকে রান্না করা হবে view.py এ । তৃতীয় ধাপে সেগুল পরিবেশন করা হবে template এ যেমনঃ index.html, contact.html ইত্যাদি।

banglai-django-view-from-model

আমাদের model.py তো ইতমধ্যে তৈরি করে ফেলেছি। এখন রান্না করার পালা। আমাদের এপ এর মধ্যে view.py ফাইলটি টেক্সট এডিটরে খুলে ফেলি। প্রথম লাইনে লেখা আছে

from django.shortcuts import render

এর কাজ আমরা একটু পরেই দেখতে পাব।

রান্নাঘরে যেমন ভাত রান্নার জন্য এক চুলা, মাংশ রান্নার জন্য আলাদা চুলা থাকে তেমনি আমরা আমাদের ভিন্ন ভিন্ন অংশ দেখানোর ভিন্ন ফাংশন ব্যাবহার করব।

যেমনঃ def post_list() পোষ্ট এর লিস্ট দেখানোর জন্য ,

def home() প্রথম পাতা দেখানোর জন্য ব্যাবহার করতে পারি।

আমাদের প্রথম উদ্দ্যেশ্য হচ্ছে প্রথমপাতা তৈরি করা যেখানে দর্শক আমাদের সকল পোষ্ট দেখতে পাবে।

তাহলে আমরা আমাদের প্রথম ভিউ তৈরি করে ফেলি

def home(request):

      return render()

আমরা home নামে একটা ফাংশন ডিক্লেয়ার করেছি যেটা প্যারামিটার হিসেবে request কে নেবে । অর্থাৎ, এই ফাংশন ইউজার এর আবদার( request) গ্রহণ করে ব্যাবহারকারীকে কিছু রিটার্ন করে দেবে। আমরা ব্যাবহারকারীকে একটা html পেজ দেখাতে চাই । html পেজ দেখানোর জন্য render() ফাংশনটি ব্যাবহার করা যেতে পারে। render() ফাংশনটি তিনটি প্যারামিটার গ্রহণ করে request, template এর  নাম, একটা পাইপলাইন যেটার মাধ্যমে কোন তথ্য ভিউ থেকে টেম্পলেট এ পাঠানো যায়।

def home(request):
    return render(request, 'index.html')

এখন আমরা index.html ফাইলটি তৈরি করব। প্রজেক্ট ডিরেক্টরিতে একটি templates ( আপনি যে কোন নাম ব্যাবহার করতে পারেন ) নামে নতুন ডিরেক্টরি তৈরি করি ।

banglai-django-tree-template

এর মধ্যে  index.html ফাইলটি তৈরি করি।

আমরা যে আমাদের Template ফাইল templates নামের ডিরেক্টরিতে রাখছি, এত বড় সাহস পেলাম কোথায়। এখন আমাদের settings ফাইলে বলে দেয়া দরকার যে, ” বস, আমরা টেম্পলেট ফাইলের কথা বললেই আপনি বুঝে নেবেন সেটা templates এর মধ্যে আছে।

আমাদের settings.py ফাইলটি খুলে নিচের অংশটি খুঁজে বের করি।

TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': ['templates'],
'APP_DIRS': True,
'OPTIONS': {
'context_processors': [
'django.template.context_processors.debug',
'django.template.context_processors.request',
'django.contrib.auth.context_processors.auth',
'django.contrib.messages.context_processors.messages',
],
},
},
]

এখানে ‘DIRS’:[] লিস্টের মধ্যে ‘templates’ যুক্ত করি

‘DIRS’:[‘templates’ ]

index.html ফাইলের মধ্যে আপনি যা ইচ্ছে তাই লিখে রাখতে পারেন।

আমাদের ভিউ তৈরি করা শেষ। এখন আমরা চাচ্ছি যে দর্শক যদি localhost:8000/home লিখে তাহলে আমরা আমাদের এই ভিউ দর্শকের সামনে হাজির করব। আমাদের সেটিং ডেরেক্টরির ( banglaidj) মধ্যে যে urls.py আছে তা খুলুন । প্রথমে এই ফাইলের মধ্যে আমাদের এপ এর ভিউ import করি

from blog_post import views

এখানে urlpatterns এর মধ্যে path() ফাংশন আছে। আরও একটি নতুন path() ফাংশন নিই। path() ফাংশন প্রথম প্যারামিটার হিসেবে url structure গ্রহণ করে। পরবর্তি প্যারামিটারে যে ভিউ দেখাতে চাই তাঁর নাম এবং তৃতীয় প্যারামিটার হিসেবে url এর নাম যাতে পরবর্তিতে এই নাম ধরে ডাক দিলে সে হাজির হয়ে যায়। পুরো ঠিকানা লেখার দরকার হবে না।

সুতরাং আমাদের urls.py হবেঃ

from django.urls import path
from django.contrib import admin
from blog_post import views

urlpatterns = [
  path('admin/', admin.site.urls),
  path('home/', views.home, name='home')
]

আমরা চাচ্ছি visitor www.banglaidjango.com/home টাইপের কোন url প্রবেশ করালে আমরা আমাদের
home টা দেখাবো। r এর অর্থ raw। এর পড়ে একটা string থাকবে। url রিকুয়েস্ট  স্ট্রিং এর মধ্যে home খুঁজতে
থাকবে। ঠিক home লেখাটি মিলে গেলে পরবর্তি ভিউ এ রিকুয়েস্ট পাঠিয়ে দেবে।

path('contact/', views.contact, name='contact-list'),
path('posts/', views.all_posts, name='all-posts')

এভাবে আমরা ইচ্ছামত url তৈরি করতে পারি।

আপনার ব্রাউজারে গিয়ে লিখুন http://localhost:8000/home/

হুররে……………… আমাদের টেমপ্লেট হাজির হয়েছে

banglai-django-first-template

পরবর্তি পোষ্টঃ টেমপ্লেটকে ডায়নামিক করুন >>

Uncategorized

সক্রিয় মেনুর ক্লাস পরিবর্তন-Django

by , on
December 14, 2016

উপরের ছবিতে  যে মেনু আছে তাতে বোঝাচ্ছে আপনি যে পেজে যাবেন তার মেনুর রঙ পরিবর্তন হয়ে যাবে।  আমরা বুটস্ট্রাপ ক্লাস active ব্যাবহার করে কাজটি করতে পারি।যে ফাইলে আপনার মেনুর কোড আছে( যেমনঃ base.html or index.html ) তা নিচের উপায়ে পরিবর্তন করুনঃ 

{% with request.resolver_match.url_name as url_name %}
<ul id="menu">
<li class="{% if url_name == 'home' %}active{% endif %}">Home</li>
<li class="{% if url_name == 'about' %}active{% endif %}">About</li>
<li class="{% if url_name == 'employer' %}active{% endif %}">Employer</li>
</ul>
{% endwith %}

আপনার URL হবে নিম্নরূপ

url(r'$','home_view', name='home'),
url(r'about/$','about_view', name='about'),
url(r'employer/$','employer_view', name='employer'),

 

Uncategorized

১-৪ঃ Django Admin

by , on
December 6, 2016

গত পর্বে আমরা আমাদের ব্লগের জন্য কাঠামো তৈরী করেছি। আজ আমরা দেখব কিভাবে সাইটের পরিচালক এই কাঠামো ব্যাবহার করে নতুন নতুন পণ্য/ ব্লগ পোষ্ট করতে পারে। প্রথমে আমাদের লোকাল সার্ভার চালু করি।

python manage.py runserver

এখন banglaidj/urls.py ফাইলটি খুললে দেখতে পাবেন

urlpatterns = [
 path('admin/', admin.site.urls),
]

জ্যাঙ্গো আমাদেরকে একটি এডমিন পাতা উপহার দিয়েছে যেখানে localhost:8000/admin এই ঠিকানার মাধ্যমে প্রবেশ করা
যাবে। আমাদের এড্রেস বারে ঠিকানাটি প্রবেশ করালে নিচের মত পাতা দেখতে পাবেন।

এখানে পরিচালকের Username, Password দিতে বলে। নতুন পরিচালক  (Django যাকে superuser বলে থাকে) তৈরি করতে হলে আমাদের টার্মিনালের সার্ভার বন্ধ করে (Ctrl+C) নিচের কমান্ড প্রবেশ করায়ঃ

python manage.py createsuperuser

আপনাকে Username, Email, Password দিতে বলবে। Password সর্বনিম্ন ৮ অক্ষর বিশিষ্ঠ হতে হবে। Superuser created successfully. লেখাটি দেখতে পেলে পুনরায় আপনার সার্ভার চালু করুন। ব্রাউজারে ফিরে গিয়ে Username, Password প্রবেশ করিয়ে লগইন করি।

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

আমাদের “blog_post”  App এর মধ্যে admin.py নামে একটি ফাইল আছে। জ্যাঙ্গো এডমিন এপ এর সাথে সকল প্রকার যোগাযোগ আমরা এই ফাইলে মাধ্যমে করব। আমাদের models.py ফাইলের Post ক্লাসটি admin.py ফাইলের মধ্যে Import করি। উভয় ফাইল একই ডিরেক্টরিতে থাকায় আমরা এভাবে লিখতে পারিঃ

from .models import Post

উল্ল্যেখ্য, models.py যদি অন্য আরেকটি ডিরেক্টরি যেমন boltu এর মধ্যে থাকত, তাহলে আমরা লিখতাম
from boltu.models import ……
আমাদের admin.py ফাইলে আগে থেকেই from django.contrib import admin আছে। আমরা এই admin কে আমাদের Page ক্লাস কে রেজিস্ট্রেশন করে নিতে বলব।

admin.site.register(Post)

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

আপনি পোষ্ট করার পর নিচের অবস্থা দেখতে পাবেন।

Post Object এর স্থানে আমাদের পোষ্ট এর টাইটেল দেখতে পারলে খুব চমৎকার হত। আমাদের Post ক্লাসে একটি রিটার্ন ম্যাথড যোগ করে আমরা কাজটি করতে পারি। __str__(self) ম্যাথডটি আমাদের কাজটি করে দেবে । সুতরাং আমাদের মডেলটি হবে ,

class Post(models.Model):
    title = models.CharField(max_length=100)
    description = models.TextField()

    def __str__(self):
        return self.title

এখন আমাদের এডমিন পেজে পোষ্টের টাইটেল অনুসারে লিস্ট দেখাবে।

আপনার পোষ্ট কিন্তু এখন শুধু আপনার সাইটের পরিচালকেরা দেখতে পারবে। কিন্তু সকল মানুষকে আপনি কিভাবে দেখাবেন ?  আগামী পর্বে আমরা দেখব কিভাবে আপনার তৈরি করা এই সব পোষ্ট কিভাবে সকলকে দেখাবেন।

ততক্ষণে আপনি আরেকটি মডেল ক্লাস তৈরি করে ফেলুন Student নামে যেখানে আপনি Student এর নাম, রোল নম্বর, ক্লাস ইত্যাদি রাখবেন এবং আপনার Admin panel থেকে আপনার সকল বন্ধুর নামে নতুন নতুন Student তৈরি করুন ।

Uncategorized

১-৩ঃ ব্লগ কাঠামো(model) তৈরি করা

by , on
December 4, 2016

আপনারা যদি ইট তৈরি করা দেখে থাকেন দেখবেন ইট তৈরি করার জন্য একটি কাঠামো বা ফর্মা থাকে। এই কাঠামোর মধ্য কাঁচামাল দিয়ে নতুন নতুন ইট তৈরি করা হয়। প্রতিটা কাঠামো থেকে তৈরি করা ইট একই রকম হয়।

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

প্রাথমিক ভাবে আমরা আমাদের ব্লগ কাঠামোতে Title এবং Description রাখব। কাঠামো তৈরি করার জন্য গত পর্বে আমরা যে APP তৈরি করেছি তার মধ্যে models.py নামে একটি ফাইল দেখতে পাবেন । টেক্সট এডিটরে ফাইলটি খুলুন। ফাইটিতে প্রথম লাইনে লেখা

from django.db import model

এখন আমরা একটা কাঠামো ( Class ) তৈরি করব যার নাম হবে Post (আপনি যে কোন নাম দিতে পারেন )। আমাদের এই কাঠামোর কিছু গুণাবলী আমরা জ্যাঙ্গোর কাছ থেকে ধার করব। পাইথনের ভাষায় যাকে বলে Inheritance. আমরা আমাদের Post ক্লাস কে django.db.models.Model ক্লাস থেকে inherit করব। তাহলে আমাদের কাঠামোটি দেখতে হবে

from django.db import models

class Post(models.Model):

আমাদের কাঠামোর প্রথম অংশটি শিরোনাম, যেটি অল্প কথার একটি বাক্য। তাই আমরা শিরোনাম লেখার জন্য জ্যাঙ্গোর কাছে থেকে ধার করা CharField() ব্যাবহার করতে পারি। জ্যাঙ্গোকে অবশ্যই বলে দিতে হবে আপনি কত Character এর শিরোনাম লিখতে চান । আমি ১০০ দিয়েছি, আপনি যা ইচ্ছা দিতে পরেন । তাই CharField() এর প্যারামিটার হিসেবে max_length উল্লেখ করতে হবে এবং বর্ননা যেহেতু অনেক বড় লেখা হতে পারে তাই TextField() ব্যাবহার করব। তাহলে আমাদের কাঠামোটি দাঁড়াবে

from django.db import models

class Post(models.Model):
    title = models.CharField(max_length=100)
    description = models.TextField()

আমাদের কাঠামো প্রস্তুত। এখন আমাদের তৈরিকৃত পণ্য ( ব্লগ পোষ্ট ) রাখার জন্য ডাটাবেজ দরকার। জ্যাঙ্গো আমাদেরকে স্বয়ংক্রিয়ভাবে sqlight3  ডাটাবেজ ব্যাবহার করতে দেয়। আপনাকে ডাটাবেজ নিয়ে তেমন কিছু ভাবতে হবে না। এখন আমাদের কাঠামোর মত ডাটাবেজ টেবিল তৈরি করতে হলে আপনার টার্মিনালে  নিচের কমান্ড লিখে Enter চাপুন।

python manage.py makemigrations

অতঃপর

python manage.py migrate

আপনার টার্মিনালে নিচের ছবির মত দেখতে পাবেন

 

আমাদের কাঠামো (Model ) প্রস্তুত। পরবর্তি পর্বে আমরা দেখব ব্লগ এডমিন কিভাবে এই কাঠামো ব্যাবহার করে নতুন নতুন ব্লগ পোষ্ট করবে।

Uncategorized

১-২ । App শুরু করা

by , on
December 3, 2016

আমরা যদি একটি বহুতল ভবন এর দিকে লক্ষ করি, সেখানে আলাদা আলাদা বিভাগ ভিন্ন ভিন্ন কাজে নিয়োজিত থাকে। যেমন ইঞ্জিনিয়ারিং বিভাগ বিল্ডিং এর নিকশা তৈরি করে, রাজ মিস্ত্রি বিভাগ কাঠামো তৈরি করে, বিদ্যুৎ মিস্ত্রি বিভাগ সকল বিদ্যুৎ এর কজ করে। এরকম অনেক গুলো বিভাগ নিয়ে একটা ভবনের প্রজেক্ট তৈরি হয়। Django তে আমরা আলাদা আলাদা বিভাগ কে App নামে চিনি। আমাদের এই ব্লগিং প্রজেক্টের ও আলাদা আলাদা App থাকতে পারে। যেমন, ইউজার ম্যানেজ করার জন্য Account, ব্লগ পোষ্ট করার জন্য Blog_Post ইত্যাদি App থাকতে পারে। সবগুলো এপ মিলে আমাদের banglaidj প্রজেক্ট সম্পুর্ন হবে।  প্রথমে আমরা একটি App তৈরি করব blog_post নামে।

যেই ডিরেক্টরিতে manage.py আছে সেখানে আপনার টার্মিনাল খুলুন। নিচের কমান্ড লিখুনঃ

python manage.py startapp blog_post

এখন দেখুন  আমাদের ডিরেক্টরিতে blog_post নামে একটি নতুন ডিরেক্টরি তৈরি হয়েছে।

আমরা যেহেতু একটি নতুন এপ তৈরি করেছি, আমাদের প্রজেক্ট কে বিষয়টি জানাতে হবে। প্রজেক্টের সেটিং ফাইলটি  ( banglaidj/settings.py ) যে কোন Text Editor এ খুলুন। এখানে INSTALLED_APPS  নামে একটি লিস্ট আছে, লিস্টের শেষে  ‘blog_post’ যোগ করুন।

INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
' blog_post',
]

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

পরবর্তী পর্বে আমরা দেখব কিভাবে আমাদের ব্লগ পোষ্টের মডেল বা কাঠামো তৈরি করা যায়।

Uncategorized

১-১। প্রজেক্ট শুরু করা

by , on
October 27, 2016

বাংলায় জ্যাঙ্গো টিউটোরিয়াল সিরিজে স্বাগতম।   টিউটোরিয়ালটি লিখতে শুরু করলাম আমার ছাত্র হাসীব  কে উৎসর্গ করে। তাকে আমি যেভাবে সহজ সরলভাবে বোঝানোর চেষ্টা করেছি এখানেও সেভাবে লেখার চেষ্টা করব ইনশা আল্লাহ । কোন কিছু বুঝতে সমস্যা মনে হলে কমেন্ট করুন অথবা  আমাকে ইমেইল করুন [email protected] । টিউটোরিয়ালের সর্বশেষ কোড পাবেন গিটহাবে

Virtual Environment এর ব্যাবহার

পাইথন ও জ্যাঙ্গো এর ভিন্ন ভিন্ন ভার্সনের ব্যাবহার ঠিক রাখার জন্য virtual environment ব্যাবহার করা হয়। বিস্তারিত দেখুন


Windows
ব্যাবহারকরী OS পরিবর্তন করাই ভাল। কারন ভবিষ্যতে আপনি পাইথন ডেভেলপার হতে চাইলে আপনি লিনাক্স প্লাটফর্ম ব্যাহবার করতে হবে। তবে শেখার সময় আপনি চাইলে উইন্ডোজ ও ব্যাবহার করতে পারেন। সেক্ষেত্রে গুগলে সার্চ করে আপনার উইন্ডোজ এ পাইথন ও জ্যাঙ্গো ইন্সটল করে নিন। 

virtual environment একটিভ করে জ্যাঙ্গো ইন্সটল করুন।

pip install django

জ্যাঙ্গো তার সর্বশেষ ভার্ষন ইন্সটল করে নেবে।

যাচাই করুন

python -m django –version

2.0.3

স্বাগতম, এখন আপনি জ্যাঙ্গো ফ্রেমওয়ার্কের মজার জগতে বিচরন করতে পারবেন। এই পর্বে আমরা ধীরে ধীরে একটা ব্লগ প্রজেক্ট তৈরী করব। প্রজেক্ট শুরু করার জন্য জ্যাঙ্গো আমাদেরকে django-admin নামে একটি কমান্ড প্রদান করে। আপনার টার্মিনাল খুলুন (Ctrl + Alt + t) । আপনি কোন ডিরেক্টরীতে আছেন জানতে ls লিখে Enter দিন। ডিফল্টভাবে Home ডিরেক্টতে টার্মিনাল থাকবে। আপনি যদি চান ডেস্কটপে প্রজেক্ট তৈরী করবেন তাহলে cd Desktop লিখুন । দেখবেন টার্মিনালে Desktop দেখাবে। শুধু cd দিয়ে এন্টার দিলে পুনরায় হোম ডিরেক্টরীতে চলে আসবে। নিচের কোডটি প্রবেশ করায়। 

django-admin startproject banglaidj

startproject কমান্ড দ্বারা আমরা জ্যাঙ্গোকে বললাম,  “আমাদের জন্য একটা প্রজেক্ট তৈরী করে দাও, যার নাম হবে  ‘banglaidj’ । ব্যাস, জ্যাঙ্গো আমাদের জন্য একটা ডেমো প্রজেক্ট তৈরী করে দিয়েছে banglaidj নামে।

আপনি টার্মিনালে যেই ডিরেক্টরী থেকে কমান্ডটি লিখেছেন সেখানেই banglaidj নামে একটি ডিরেক্টরী তৈরী হবে। আমি home ডিরেক্টরী থেকে প্রজেক্ট তৈরী করেছি । আপনারা চাইলে যে কোন ডিরেক্টরী থেকেই প্রজেক্ট তৈরী করতে পারেন ।

banglaidj   ডিরেক্টরিতে  প্রবেশ করি।

cd banglaidj

সেখানে banglaidj নামে আরো একটি ডিরেক্টরি  এবং manage.py একটি ফাইল রয়েছে । এখন আমরা এই manage.py দিয়ে আমাদের প্রজেক্ট ম্যানেজ করব। ls কমান্ড দিয়ে দেখুন আপনি সঠিক ডিরেক্টরিতে আছেন কিনা।

django ডেভেলপমেন্ট সার্ভার

 এখন দেখি আমাদের প্রজেক্ট ঠিকঠাক মত কাজ করে কিনা। টার্মিনালে লিখুন,

python manage.py runserver

 

আপনি নিচের লেখাটি দেখতে পাচ্ছেন

Performing system checks...

System check identified no issues (0 silenced).

You have 14 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.

May 02, 2018 - 13:50:20
Django version 2.0.5, using settings 'banglaidj.settings'
Starting development server at http://127.0.0.1:8000/
Quit the server with CONTROL-C.

আপনি জ্যাঙ্গো ওয়েব সার্ভার চালু করেছেন, যা পাইথন দিয়ে তৈরী একটি lightweight ওয়েব সার্ভার। python manage.py runserver দিলে জ্যাঙ্গো আমাদের জন্য একটা ডেভেলপমেন্ট ওয়েব সার্ভার রান করে দেয় ,যেটা 127.0.0.1 আইপি এর 8000 পোর্টে রান হয়। তাই আমরা 127.0.0.1:8000 বা localhost:8000 এড্রেসে ঢুকে জ্যাঙ্গ এর তৈরী করা ডিফল্ট ওয়েব পেজ দেখতে পায়। কিন্তু প্রডাকশনের জন্য এই ডেভেলপমেন্ট সার্ভার ব্যাবহার করা উচিৎ নয়।

Address বার এ 127.0.0.1:8000 লিখে প্রবেশ করুন । নিচের মত পেজ দেখতে পাবেন

এটি হচ্ছে জ্যাঙ্গো এর প্রথম পাতা যা  জ্যাঙ্গো তার ওয়বে সার্ভারের মাধ্যমে আমাদেরকে প্রদান করছে।

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

আগের পোষ্ট:জ্যাঙ্গো কি                                                                  পরের পোষ্ট: App শুরু করা

Uncategorized

সমাধানঃ python-social-auth, ফেচবুক থেকে ইমেইল না পাওয়া

by , on
October 16, 2016

python-social-auth ব্যাবহার করে জ্যাঙ্গো ওয়েব পেজে সামাজিক যোগাযোগের মাধ্যমের একাউন্ট দিয়ে সরাসরি লগইন করা যায়। এই টুলস ব্যাবহার করতে গিয়ে বেজায় ঝামেলা পোহালাম। সবকিছু ঠিকঠাক কিন্তু ফেচবুক আমাকে Email দিচ্ছে না। Email ফিল্ড খালি রেখেই লগইন করিয়ে দিচ্ছে। কিন্তু আমার এপ এর জন্য Email পাওয়া খুব জরুরী । টানা ৪ দিন  ঘটাঘাটীর পর সমস্যা ধরতে পারলাম । ফেচবুক সম্প্রতি তাদের API পরিবর্তন করেছে। তাই

SOCIAL_AUTH_FACEBOOK_SCOPE = [’email’]

এই সেটিংস কোন Email পাঠাচ্ছে না। তাই এখন আপনাকে ফেচবুকের কাছে অতিরিক্ত একটি আবেদন করতে হবে Email পাওয়ার জন্য।

SOCIAL_AUTH_FACEBOOK_PROFILE_EXTRA_PARAMS = {
    'fields': 'id,name,email', # needed starting from protocol v2.4
}

এই লাইনটি যোগ করুন আপনার সেটিংস ফাইলে । ব্যাস, ফেচবুক এখন আপনাকে সুড়সুড় করে Email দিয়ে দেবে।
LinkedIn লগইন এর ক্ষেত্রেও একই ঝামেলায় পরেছিলাম। ভাবলাম তারাও কি API পরিবর্তন করল নাকি ?
ডকুমেন্টেশন ঘেঁটে দেখলাম আমিই ভুল করে বসে আছি।
আমি ব্যাবহার করেছি OAUTH2 আর সেটিংস বসিয়ে রেখেছি OAUTH1 এর ।

LinkedIn স্কোপ ব্যাবহার করার নিয়মঃ

SOCIAL_AUTH_LINKEDIN_OAUTH2_SCOPE = ['r_emailaddress']

নিচের লাইনটাও যোগ করতে হবেঃ

SOCIAL_AUTH_LINKEDIN_OAUTH2_FIELD_SELECTORS = ['email-address']

 

Uncategorized

Fibonacci number in python

by , on
August 12, 2016
#!/usr/bin/env python
# -*- coding: UTF-8 -*-

count = input("Enter range of fibonacci number: ")
first = 0
second = first+1
for i in range(count):
    if i<=1:
        next = i
    else:
        next = first + second
        first = second
        second = next
    print next

Uncategorized

Cross-Origin Request Blocked:(Solved)

by , on
August 10, 2016
The problem occurs when I tried to get/send request to other site developed in django. Actually I wanted to handle my app from other app with Json response. The error message is:

Cross-Origin Request Blocked: The Same Origin Policy disallows reading the remote resource at http//127.0.0.1:8000/card-active-deactive/1233459225/161-10-124/active. (Reason: CORS header ‘Access-Control-Allow-Origin’ missing).

Solution:
1.django-cors-headers add to django app to allow request from other url.
      https://github.com/ottoyiu/django-cors-headers/
2. Change views.py view return method:
response = JsonResponse({'Success':'true'})
response['Access-Control-Allow-Origin'] = '*'
return response
3.Js:
    $( document ).ready(function() {
        $(".cBalance").click(function() {
            var userId='161-10-124';
            var appKey="1233459225";
            var self = this;
          $.ajax({
           type      : 'GET',
           url       : 'http://127.0.0.1:8000/get-balance/'+appKey+'/'+userId,
           //crossDomain : true,
           dataType  : 'json',
           success   : function(data) {
                 if(data.Balance)
                 {
                    $('p').html('Your Balance is: '+data.Balance+' Taka');
                 }
                 else
                 {
                  alert('Error: '+data.Error);
                 }
           },
            error     : function(error)
            {
              alert('Error: Something went wrong!! Mail: [email protected]');
            },
         });
       });
});