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

এই টিউটোরিয়ালে যেসব বিষয়গুলো থাকছে-
  •  ব্লগের মোট পোস্ট সংখ্যা দেখানোর জন্য custom template tag ।
  • ব্লগের  latest post গুলো দেখানোর জন্য custom template tag।

“বেশি করে আলু খান, ভাতের উপর চাপ কমান।” এই টাইপ একটা স্লােগান বাংলাদেশে কোন একসময় খুব প্রচারিত হতো।  অর্থাৎ একটার উপর থেকে চাপ কমানোর জন্য আরেকটার বিকল্প ব্যবহার।

জ্যাঙ্গোতে আমরা সাধারণত বিভিন্ন কুয়েরী চালিয়ে কোন ডাটাকে views.py থেকে কনটেক্সট ডাটা হিসেবে টেমপ্লেটে পাঠাই। সেক্ষত্রে আমাদের অ্যাপসের ফাংশানালিটি যদি বেশি হয়, তবে views.py ফাইলে কোডের লাইন সংখ্যা বেড়ে যায়।

views.py ফাইলের উপর থেকে চাপ কমানোর জন্য ছোটখাটো কিছু কুয়েরী বা অপারেশন আমরা custom template tags এর মাধ্যমে তৈরি করার চেষ্টা করবো।

জ্যাঙ্গো কাস্টম টেমপ্লেট ট্যাগ তৈরি করার জন্য  simple_tags এবং inclusion_tags নামে দুইটা ফাংশনালিটি প্রদান করে।

  • simple_tags: string বা কাঙ্খিত রেজাল্ট return করে।
  • inclusion_tags: render template রির্টান করে।

এখন মনে করি আমাদের blog নামে একটা এপস আছে যেখানে Post নামে একটি model ক্লাস রয়েছে। আমরা চাই আমাদের blog এ যতগুলো পোস্ট আছে তা কাউন্ট করে টেমপ্লেটে প্রদর্শন করতে। এর জন্য আমরা total_post নামে একটা custom template tag লিখবো।

এই কাজটা করার জন্য blog ডিরেক্টরীতে templatetags নামে একটা নতুন ফোল্ডার তৈরি করি। এই ফোল্ডারের ভিতের __init__.py এবং blog_tags.py নামে দুটি নতুন ফাইল তৈরি করি-

templatetags/
   __init__.py
   blog_tags.py

এখন blog_tags.py ফাইলটিকে ওপেন করে নিচের কোডটুকু লিখা যাক:

from django import template
from blog.models import Post
register = template.Library()
@register.simple_tag
def total_post():
    return Post.objects.count()
  • প্রথমেই django এর template মডিউলকে import করা হয়েছে।
  • সবগুলো পোস্ট কাউন্ট করার জন্য model  থেকে Post মডেল ক্লাস import করা হয়েছে।
  • কাষ্টম টেমপ্লেট ট্যাগটিকে জ্যাঙ্গোর টেমপ্লেট লাইব্ররীতে যুক্ত করার জন্য register নামে template.Library() এর instance তৈরি করা হয়েছে।
  • তারপর total_post() নামে একটি মেথড তৈরি করা হয়েছে এবং এটাকে simple tag হিসেবে বিবেচনা করার জন্য @register.simple_tag ডেকোরেটর ব্যবহার করা হয়েছে।

মেথডের নামটিই কাস্টম ট্যাগ এর নাম হিসেবে ব্যবহার করা হবে। ট্যাগের অন্য কোন নাম দিতে চাইলে simple tag ডেকোরেটরের ভিতরে name প্যারামিটার ব্যবহার করে ট্যাগের ভিন্ন কোন নাম দেওয়া যাবে। যেমন- @register.simple_tag(name=’my_tag’)

  • তারপর Post মডেলে যতগুলো পোস্ট অবজেক্ট আছে সবগুলো গণনা করে return করা হয়েছে।

এরপর কাজ হবে custom tags এর  ফাইলটা অর্থাৎ blog_tags.py কে base template অথবা যে template এর মধ্যে আমরা কাস্টম ট্যাগ ব্যবহার করবো সেখানে  load করা অর্থাৎ টেমপ্লেটের শুরুতেই –

{% load blog_tags %}

এই অংশটুকু যোগ করতে হবে। তারপর template এর যেখানে আমরা total post এর সংখ্যা দেখাতে চাই সেখানে –

{% total_post %}

এই অংশটুকু যোগ করলেই মোট পোস্টর সংখ্যাটা দেখাবে।

Custom Tag For Latest Post:

এখন আমরা আরেকটি কাস্টম ট্যাগ বানাবো যার মাধ্যমে যেন আমরা  latest post  খুঁজে বের করতে পারি। এটা করার জন্য আমরা inclusion_tag ব্যবহার করবো (simple_tag ব্যবহার করে নিজেরা চেষ্টা করে দেখতে পারেন)।

blog_tags.py ফাইলটা edit করা যাক-

from django import template
from blog.models import Post

register = template.Library()

@register.simple_tag
def total_post():
    return Post.objects.count()

@register.inclusion_tag('blog/post/latest_posts.html')
def show_latest_posts(count=5):
    latest_posts = Post.objects.order_by('-publish')[:count]
    return {'latest_posts':latest_posts}
    • show_latest_posts নামে নতুন আরেকটা মেথড ব্যবহার করা হয়েছে। যেখানে count  নামে একটা প্যারামিটার নেওয়া হয়েছে ডিফল্টভাবে যার ভ্যালু 5   । যখন show_latest_posts ট্যাগটি টেমপ্লেটে ব্যবহার করা হবে তখন কতগুলো latest post দেখাতে চাই সেটা নির্ধারণ করে দেওয়ার জন্য count প্যারামিটারটি ব্যবহার করা হয়েছে।
    • @register.inclusion_tag ডেকোরেটরের মধ্যে নতুন একটা টেমপ্লেট latest_posts.html উল্লেখ করা হয়েছে। এর ফলে {% show_latest_post %} ট্যাগটি latest_posts.html টেমপ্লটেকে  কাঙ্খিত টেমপ্লটে(যেই template এ এই ট্যাগ ব্যবহার করা হবে) render করবে।
    • Post মডেল থেকে কুয়েরী চালিয়ে latest publish date অনুযায়ী সাজিয়ে count এর সমান সংখ্যক পোস্টকে latest_posts ভ্যারিয়বলে রাখা হয়েছে।
    • মেথডটি dictionary টাইপ ডাটা রিটার্ন করেছে (context ডাটা হিসেবে) যা আমরা render কৃত template (latest_posts.html) এ ব্যবহার করতে পারবো।

     

এখন latest_posts.html টেমপ্লটেকে edit করা  যাক:

<ul>
  {% for post in latest_posts  %}     
  <li>
     <a href="{{post.get_absolute_url}}">{{post.title}}</a>
  </li>
  {% endfor %}
</ul>

এখানে show_latest_posts মেথড যে context ডাটা(latest_posts) রির্টান করেছিলো, সেটা ব্যবহার করে unordered list এর মধ্যে for লুপ এর মাধ্যমে প্রতিটা পোস্টের title প্রদর্শন করা হয়েছে, সাথে প্রতিটা টাইটেলের সাথে তাদের details এর লিঙ্ক যুক্ত করে দেওয়া হয়েছে।

এখন আমরা যেকোন template এর মধ্যে যে স্থানে {% show_latest_posts  %} ট্যাগটি ব্যবহার করবো, সেখানে latest_posts.html  টেমপ্লটেটি render হবে অর্থাৎ সেখানে latest post গুলো unordered list আকারে দেখাবে। latest post এর সংখ্যা নির্ধারণ করে দেওয়ার জন্য show_latest_posts ট্যাগটির পরে কাঙ্খিত সংখ্যা উল্লেখ করতে হবে।

যেমন- যদি latest চারটি পোস্ট দেখাতে চাই তবে-

{% show_latest_posts  4  %}

আশা করি সবাই বুঝে গেছেন কিভাবে কাস্টম ট্যাগ ব্যবহার করে views.py এর চাপ কিছুটা কমাতে পারি।

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

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

Leave a Reply

Your email address will not be published. Required fields are marked *