Django-taggit in Bangla (Add tags in your posts)

 

এই টিউটোরিয়ালে যে বিষয়গুলো থাকছে-

  • Adding tags in your post
  • Find posts by tags
  • Display similar posts

জ্যাঙ্গোতে ট্যাগ যোগ করার জন্য  django-taggit  নামক একটা থার্ডপার্টি এপস ব্যবহার করবো। এর জন্য প্রথমেই  django-taggit ইন্সটল করতে হবে-

pip install django-taggit

 

ইন্সটল প্রক্রিয়া সম্পন্ন হওয়ার পর  প্রজেক্টের (blog) settings.py ফাইলে যেয়ে INSTALLED_APPS এর লিস্টে ‘taggit‘ যোগ করে দিতে হবে।

Adding tags in your post:

আমরা প্রতিটা পোস্টের মধ্যে ট্যাগ যোগ করতে চাই। ধরি, blog নামক এপসের models.py ফাইলে পোস্ট  এর জন্য  Post নামে একটা মডেল ক্লাস রয়েছে। এখন এই Post মডেল ক্লাসটির মধ্যেই আমরা প্রতিটা পোস্ট অবজেক্টের জন্য ট্যাগ যোগ করবো-

  • এখানে TaggableManager() প্রতিটা  অবেজেক্টের জন্য (এখানে পোস্ট অবজেক্ট)  ট্যাগ add,remove, retrieve অপারেশন সম্পন্ন করে থাকে।

এর পর makemigrations এবং পরে migrate কমান্ডের মাধ্যমে  django-taggit এর জন্য ডাটাবেস টেবিল তৈরি করতে হবে।

taggit এর ডাটাবেস টেবিলের রিলেশনটা এরকম হবে-

 

taggit_tag Table:

  • taggit_tag টেবিলে এর মধ্যে প্রতিটা ট্যাগের নাম থাকবে। অর্থাৎ প্রতিটা ট্যাগই হচ্ছে একেকটা অবজেক্ট।

taggit_taggeditem Table(Look Up Table):

  •  object_id  তে পােস্ট অবজেক্টর id থাকবে।
  • উক্ত পোস্ট অবজেক্টটির জন্য   নির্দিষ্ট tag_id থাকবে যা taggit_tag টেবিলের id কে নির্দেশ করবে আর প্রতিটা id এর জন্য taggit_tag টেবিলে অনেকগুলো ট্যাগের অবজেক্ট (tags) থাকবে।
  •  content_type_id টা হচ্ছে প্রতিটা পোস্ট অবজেক্টের জন্য ভিন্ন ভিন্ন id যা জ্যাঙ্গো অটোমেটিক্যালি তৈরি করে থাকে।

 

এখন python manage.py shell কমান্ডের  মাধ্যমে পাইথনের শেল টার্মিনাল ওপেন করি। তারপর Post মডেলের ডাটাবেস থেকে কুয়েরি করে যেকোন একটা পোস্ট অবজেক্টকে একসেস করি-

আমরা ডাটাবেস টেবিল থেকে id =2 নং পোস্ট অবজেক্টটি কুয়েরী করে post নামক ভ্যারিয়বলের মধ্যে রেখে দিলাম। এখন কাজ হবে এই post এর সাথে ট্যাগ যোগ করা-

আমরা python এবং django নামে দুইটা ট্যাগ, পোস্ট অবজেক্টির সাথে যুক্ত করে দিলাম।

এখন ডাটাবেস টেবিল দেখতে কেমন হবে  দেখা যাক-

taggit_tag
id name slug
1 python python
2 django django
taggit_taggeditem
id object_id content_type_id tag_id
1 2 9 1
2 2 9 2

অর্থাৎ content_type  9, যার  অবজেক্ট id 2, তে tag_id  1 এবং 2 দুটি ট্যাগ যুক্ত আছে।

এখন আমরা চাই আমাদের ট্যাগগুলো  list.html টেমপ্লেটের প্রতিটা পোস্টের নিচে দেখাবে।

সেজন্য list.html টেমপ্লেটের  পোস্টের টাইটেলের নিচে এটা যুক্ত করি-

এখানে post.tags.all|join  প্রতিটা পোস্টের জন্য সবগুলো ট্যাগকে কমা (,) দিয়ে জয়েন্ট করে এক লাইনে দেখানোর জন্য ব্যবহার করা হয়েছে।

Find posts by tags:

এখন আমরা  প্রতিটা ট্যাগের সাথে লিঙ্ক যুক্ত করতে চাই, যেন যেকোন ট্যাগের মধ্যে ক্লিক করলে এই ট্যাগ রিলেটেড  সবগুলো পোস্টের লিস্ট দেখা যায়।

এই কাজটা করার জন্য যেসব কাজ করতে হবে-

  1. প্রতিটা ট্যাগে যখন ক্লিক করবো তখন সেই ট্যাগের slug সংগ্রহ করা। এর জন্য আলাদা URL লিখতে হবে  slug এর ডাটা নেয়ার জন্য।
  2. সংগ্রহকৃত slug টা কোন কোন অবজেক্টের মধ্যে আছে তা views.py ফাইলের list_view  ফাশংনের মধ্যে কুয়েরী চালিয়ে বের করা।
  3. প্রাপ্ত রেজাল্টগুলো পুনরায় list.html টেমপ্লেটে render করা।

উপরের স্টেপগুলো এবার এক এক করে ইমপ্লিমেন্ট করা যাক। এর জন্য আমরা প্রথমে এটা ধরে নিই যে, views.py  ফাইলে আমাদের post_list নামক একটা মেথড রয়েছে যার কাজ হচ্ছে পোস্ট অবজেক্টগুলোর লিস্ট render করে টেমপ্লেটে পাঠানো।

এখন blog নামক অ্যাপস এর urls.py ফাইলে urlpatterns=[] এর ভিতরে নতুন একটি URL তৈরি করি-

এবার views.py  edit করা যাক-

  • প্যারামিটার হিসেবে tag_slug=None নেওয়া হয়েছে। কারণ সাধারণভাবে যখন কোন ট্যাগ থাকবে না, তখন এটা None।
  • posts নামক ভ্যারিয়বলের মধ্যে Post  মডেলের ডাটাবেসে কুয়েরী চালিয়ে সকল পোস্ট অবজেক্টের একটা লিস্ট তৈরি করা হয়েছে।
  • tag নামক ভ্যারিয়বল শুরুতে None
  • যদি  tag_slug থাকে, তবে tag ভ্যারিয়েবলের  ভ্যালু সেই tag_slug এর অবজেক্ট হবে।
  • tag_slug এর ভ্যালু এখানে একটা string  ।  ইতিপূর্বে আমরা দেখেছি যে, tags গুলো taggit_tag (Tag)  এর অবজেক্ট । tag_slug এর ভ্যালু (string) এর মাধ্যমে Tag মডেল থেকে  উক্ত ট্যাগের অবজেক্টটি কুয়েরী করা হয়েছে।
  • যে পোস্ট অবজেক্টগুলোর tags ফিল্ডের মধ্যে ঐ tag  অবজেক্টগুলো আছে তা filter এর মাধ্যমে বের করা হয়েছে।
  • সবশেষে posts এবং tag কনটেক্স ডাটা হিসেবে পাঠানো হয়েছে।

এখন list.html টেমপ্লেটের প্রতিটা ট্যাগ এর মধ্যে লিঙ্ক যুক্ত করতে হবে যা tag.slug কে URL এর মাধ্যমে post_list view তে প্যারামিটার হিসেবে পাঠিয়ে দিবে-

এখন যেকোন পোস্টের যেকােন tags এ ক্লিক করলে সেই ট্যাগ রিলেটেড সবগুলো পোস্টের লিস্ট দেখা যাবে।

Display similar posts:

এখন  যদি এমন চাই ,  যে পােস্টটির details পড়া হবে, সেই পোস্টের ট্যাগ রিলেটেড  অন্যান্য পােস্টগুলোও  (similar post)  সাজেস্ট করবে, তাহলে views.py ফাইলের post_detail মেথডের মধ্যে আমরা কিছু পরিবর্তন করে কাজটা খুব সহজেই করতে পারি-

  • যে পোস্ট অবজেক্টটির details পড়তে চাই, সেই পোস্ট অবজেক্টটি Post মডেল থেকে বিভিন্ন কিওয়ার্ড আর্গুমেন্ট  এর মাধ্যমে get_object_or_404 মেথড ব্যবহার করে কুয়েরী করা হয়েছে।
  • তারপর সেই post অবজেক্টির যতগুলো tags আছে, সবগুলোর id নিয়ে একটি লিস্ট তৈরি করা হয়েছে।
  • তারপর এই post_tags_ids গুলো নিয়ে Post মডেলে কুয়েরী করে যতগুলো পোস্ট অবজেক্টের মধ্যে এই tag id গুলো রয়েছে সবগুলোর একটা লিস্ট similar_post ভ্যারিয়েবলের মধ্যে রাখা হয়েছে। বর্তমান পোস্ট অবজেক্টটি বাদ দেওয়ার জন্য exclude ব্যবহার করা হয়েছে।
  • এরপর annotate() মেথডের মাধ্যমে  প্রতিটা similar_post অবজেক্টের জন্য same_tags নামক একটা অ্যাট্রিবিউট তৈরি করা হয়েছে, যা প্রতিটা similar post এর tags গুলোকে Count() মেথডের মাধ্যমে  সর্বাধিক মিলের ভিত্তিতে গণনা করে একটা কুয়েরী সেট প্রদান করে।
  • .order_by() মেথডের মাধ্যমে similar_tags এর ভ্যালু বড় থেকে ছোট এর ভিত্তেত সাজানো হয়েছে এবং [:4] এর মাধ্যমে সর্বাধিক মিলের 4 টা  similar post কে রাখা হয়েছে।
  • এর পর similar_post কে কনটেক্স ডাটা আকারে টেমপ্লেটর জন্য  পাঠানো হয়েছে।

এতটুকু শেষ করার পর ইচ্ছে মতো টেমপ্লেটর details.html এর যেকোন  জায়গাতে আমরা similar post গুলো দেখাতে পারি।

ধন্যবাদ সাথে থাকার জন্য..।

(If you have any question, please feel free to ask)

[If you find any inconsistency, please let me know]

I am Student of Textile Engineering but Programmer. I love programming and love to write about programming... :)

Site Footer