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

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]');
            },
         });
       });
});

 

Uncategorized

জ্যাঙ্গো সাইটে আপলোড করা ছবির নাম পরিবর্তন এবং পুর্বের ছবি পুনঃস্থাপন করা

by , on
July 31, 2016

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

# app/models.py
def imageFileRename(instance, filename):
    file_root, file_ext = os.path.splitext(filename)
    name = str(instance) + file_ext.lower()
    return name  

class Item:
      item_photo = models.ImageField(storage=OverwriteStorage(), upload_to=imageFileRename)

 

 # app/storage.py
from django.core.files.storage import FileSystemStorage
from django.conf import settings
import os

class OverwriteStorage(FileSystemStorage):

    def get_available_name(self, name):
        """Returns a filename that's free on the target storage system, and        available for new content to be written to.
        Found at http://djangosnippets.org/snippets/976/
        This file storage solves overwrite on upload problem. Another        proposed solution was to override the save method on the model        like so (from https://code.djangoproject.com/ticket/11663):
        def save(self, *args, **kwargs):            try:                this = MyModelName.objects.get(id=self.id)                if this.MyImageFieldName != self.MyImageFieldName:                    this.MyImageFieldName.delete()            except: pass            super(MyModelName, self).save(*args, **kwargs)        """        # If the filename already exists, remove it as if it was a true file system        if self.exists(name):
            os.remove(os.path.join(settings.MEDIA_ROOT, name))
        return name

Uncategorized

পাইথন জ্যাঙ্গো সাইটে HTML পেজ থেকে PDF ফাইল তৈরি করা

by , on
July 31, 2016

পাইথন রিপোর্টল্যাব( Reportlab)  লাইব্রেরী ব্যাবহার করে জ্যাঙ্গো সাইটে  পিডিএফ ফাইল তৈরি করা যায়,  কিন্তু প্রক্রিয়াটা একটু জটিল। xhtml2pdf এবং Reportlab লাইব্রেরী ব্যাবহার করে খুব সহজে html পেজ কে pdf ফাইলে রূপান্তর করা যায়।
Reportlab, xhtml2pdf, html5lib, pypdf ইন্সটল করে ফেলুন।

pip install xhtml2pdf

 

import cStringIO as StringIO
from xhtml2pdf import pisa
from django.template.loader import get_template
from django.template import Context
from django.http import HttpResponse
from cgi import escape

 

# Render pdf
def render_to_pdf(template_src, context_dict):
    template = get_template(template_src)
    context = Context(context_dict)
    html  = template.render(context)
    result = StringIO.StringIO()

    # pdf name generate with date    
    date = datetime.date.today()
    tmpName = template_src.split('.')[0]
    pdfName=tmpName + "-"+ str(date)

    pdf = pisa.pisaDocument(StringIO.StringIO(html.encode("ISO-8859-1")), result)
    
    if not pdf.err:
        response = HttpResponse(result.getvalue(), content_type='application/pdf')
        response['Content-Disposition'] = 'attachment; filename='+pdfName+'.pdf'        
        return response
    return HttpResponse('We had some errors<pre>%s</pre>' % escape(html))

 

উপরের অংশ আপনার views.py ফাইলে যুক্ত করুন।

date = datetime.date.today()
tmpName = template_src.split(‘.’)[0]
pdfName=tmpName + “-“+ str(date)

এই অংশ দ্বারা ফাইলের নাম তৈরি করবে। আমি টেমপ্লেটের নামের সাথে পাইথনের ডেটটাইম মডিউল ব্যাবহার করে আজকের দিনের তারিখ  যুক্ত করে ফাইলের নাম তৈরি করেছি। অর্থাৎ , template-name-2016-05-20.pdf

response['Content-Disposition'] = 'attachment; filename='+pdfName+'.pdf'

অংশটি ফাইলের নাম তৈরি করবে।

def myVewFuntion(request):
    posts = Post.objects.all()
    context = {'posts':posts} 
    return render_to_pdf( 'allposts.html',context )

আপনার view ফাংশনে  render_to_pdf রিটার্ন করুন.একটই এইচটিএমএল ফাইল তৈরি করুন। উল্লেখ্য এখানে ইনলাইন  CSS ব্যাবহার করতে হবে। অন্য ফাইল থেকে সংযুক্ত CSS এখানে কাজ করবে না। তাই আপনার Html ফাইলের মধ্যেই স্টাইল কোড লিখতে হবে।

 ##  allposts.html
<!DOCTYPE html>
 <html lang="en">
 <head> 
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<style>*{margin:0;padding:0;}
.bg{
 width: 100%;
 background-color:#dcdcdc;
}

table {
border-spacing: 0;
border-collapse: separate;
}
.thead td{
  font-weight: bold;
  color:blue;
}
.red
{
  color:red;
  font-weight: bold;
}
.green {
  color:green;
  font-weight: bold;
}
.logo{
  height: 70px;
  width: 60px;
}

.foot{
    border-top: 1px solid black;
}
</style></head>
<body >
{% if posts %}
<div id="admit"> 
    <table class="bg"> 
        <tr> 
            <td class="righthead"> 
                <img class="logo" src="./media/harun.png"> 
                <h1>Harun Or Rashid</h1>            
             </td>
        </tr>
     </table>
     <table class="footer"> 
         <td><strong>@Developed by Harun</strong></td>        
         </tr>
      </table> 
    {% endif %}
    </body>
</html>