“বেশি করে আলু খান, ভাতের উপর চাপ কমান।” এই টাইপ একটা স্লােগান বাংলাদেশে কোন একসময় খুব প্রচারিত হতো। অর্থাৎ একটার উপর থেকে চাপ কমানোর জন্য আরেকটার বিকল্প ব্যবহার।
জ্যাঙ্গোতে আমরা সাধারণত বিভিন্ন কুয়েরী চালিয়ে কোন ডাটাকে views.py থেকে কনটেক্সট ডাটা হিসেবে টেমপ্লেটে পাঠাই। সেক্ষত্রে আমাদের অ্যাপসের ফাংশানালিটি যদি বেশি হয়, তবে views.py ফাইলে কোডের লাইন সংখ্যা বেড়ে যায়।
views.py ফাইলের উপর থেকে চাপ কমানোর জন্য ছোটখাটো কিছু কুয়েরী বা অপারেশন আমরা custom template tags এর মাধ্যমে তৈরি করার চেষ্টা করবো।
জ্যাঙ্গো কাস্টম টেমপ্লেট ট্যাগ তৈরি করার জন্য simple_tags এবং inclusion_tags নামে দুইটা ফাংশনালিটি প্রদান করে।
এখন মনে করি আমাদের 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()
মেথডের নামটিই কাস্টম ট্যাগ এর নাম হিসেবে ব্যবহার করা হবে। ট্যাগের অন্য কোন নাম দিতে চাইলে simple tag ডেকোরেটরের ভিতরে name প্যারামিটার ব্যবহার করে ট্যাগের ভিন্ন কোন নাম দেওয়া যাবে। যেমন- @register.simple_tag(name=’my_tag’)
এরপর কাজ হবে custom tags এর ফাইলটা অর্থাৎ blog_tags.py কে base template অথবা যে template এর মধ্যে আমরা কাস্টম ট্যাগ ব্যবহার করবো সেখানে load করা অর্থাৎ টেমপ্লেটের শুরুতেই –
{% load blog_tags %}
এই অংশটুকু যোগ করতে হবে। তারপর template এর যেখানে আমরা total post এর সংখ্যা দেখাতে চাই সেখানে –
{% total_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}
এখন 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]
বাংলায় জ্যাঙ্গো
Design by ThemeShift.