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

ইতমধ্যে আমরা একটি পেজে সকল পোষ্ট লিষ্ট দেখানো শিখে ফেলেছি।এখন আমরা দেখব কিভাবে একটি পোষ্ট ক্লিক করলে ওই পোষ্ট বিস্তারিত দেখাবে।

একটা পরিকল্পনা করা যাক। আমরা চাচ্ছি, ৫ নম্বর পোষ্টে ক্লিক করলে ওই পোষ্টের বিস্তারিত দেখাবে। কোন পোষ্টের নম্বর কত এটা আমরা কিভাবে জানবো ? জ্যাঙ্গো প্রতিটা পোষ্ট save করার সময় তার একটা ID নির্দিষ্ট করে দেয়। ID কে আবার pk(primary key) ও বলে।

কোন পোষ্ট এর ID কত তা একটু দেখে নেয়া যাক। templates/post_list.html খুলে <li>{{ post.title }}</li> অংশ খুজে দেখি। আমরা প্রতিটা পোষ্ট এর টাইটেল এর শুরুতে তার নম্বর দেখাবো । <li></li> এর মধ্যে {{ post.pk }} যোগ করি ।

<li>{{ post.pk }}- {{ post.title }}</li>

আমরা সকল পোষ্ট দেখানোর জন্য ব্যাবহার করেছি

Post.objects.all()

অর্থাৎ, all() ম্যাথোড এর কাজ হল সকল object কে নিয়ে আসা। আবার আমি যদি বলি, ওই পোষ্ট আমাকে দেখাও যার id হল ৫ বা যার টাইটেলের শুরুতে django লেখাটি আছে। জ্যাঙ্গো এই কাজ কে বলে Query ।একটা নির্দিষ্ট object কে Query করার জন্য get() ম্যাথোড ব্যাবহার করা হয়। কি Query করতে চাই তা get() ম্যাথোড এর parameter হিসেবে দিতে হবে। তাহলে আমাদের Query হবে

Post.objects.get(pk=5)

blog_post/views.py এ আরেকটি নতুন ভিউ তৈরী করি।

def single_post(request):
   post = Post.objects.get(pk=5)
   print(post)
   return render(request, 'single_post.html')

অবশ্যই templates ডিরেক্টরির মধ্যে single_post.html নামে একটি ফাইল তেরী করি। এই ভিউ দেখার জন্য url তৈরী করি।

banglaidj/urls.py

urlpatterns = [
    path('admin/', admin.site.urls),
    path('home/', views.home, name='home'),
    path('post-list/', views.post_list, name='post-list'),
    path('single-post/', views.single_post, name='single-post')
]

ব্রাউজারে http://127.0.0.1:8000/single-post/ প্রবেশ করায়।

 

Post matching query does not exist.

ওহ, আমাদের তো ৫ নম্বর ID বিশিষ্ঠ কোন পোষ্ট নেই। pk=3 দিয়ে দেখি। টার্মিনালে লক্ষ করি “first demo post title for test” ওর্থাৎ, আপনার ৩ নম্বর পোষ্টের টাইটেল দেখাচ্ছে। এটিকে আমাদের পেজে দেখায়।

#blog_post/views.py

def single_post(request):
    post = Post.objects.get(pk=3)
    print(post)
    return render(request, 'single_post.html', {'post':post})

 

# templates/single_post.html

<h2>{{ post.title }}</h2>

<p>{{ post.description }}</p>

 

আমরা pk এর মান ৩,৫ এভাবে দিচ্ছি। এখন আমরা চাচ্ছি post_list পেজের যে পোষ্ট এ ক্লিক করবে pk এর মান হবে ঐ পোষ্ট এর ID

আমাদের url হবে http://127.0.0.1:8000/single-post/3 প্রবেশ করালে আমাদের ভিউ এই ৩ কে গ্রহন করবে। url ডিজাইন হবে

urlpatterns = [
    path('admin/', admin.site.urls),
    path('home/', views.home, name='home'),
    path('post-list/', views.post_list, name='post-list'),
    path('single-post/<post_id>/', views.single_post, name='single-post')
]

<post_id> একটি Regular Expression, single-post/এর পর আমরা ১৯ এর যে কোন ডিজিট ব্যাবহার করতে পারব এবং তা post_id এর মধ্যে রাখবে। আমাদের ভিউ পরিবর্তন করি

def single_post(request, post_id):
    post = Post.objects.get(pk=post_id)
    print(post)
    return render(request, 'single_post.html', {'post':post})

আমাদের single_post ভিউ এখন post_id এর মান গ্রহন করবে।

এখন http://127.0.0.1:8000/single-post/1/ ব্রাউজারে প্রবেশ করায়। ১ এর স্থলে ২, ৩ দিয়ে দেখুন আপনার পোষ্ট পরিবর্তন হচ্ছে।

post_list পেজের প্রতিটা পোষ্টে লিঙ্ক যুক্ত করি।

<body>
   <div class="container">
   <div class="page-header page-header-custom">
      <h1 class="text-center">বাঙলায় জ্যাঙ্গো </h1>
   </div>
   <div class="jumbotron">
      <h2>সকল পোষ্ট তালিকা </h2>
      {% for post in post_list %}
          <h3><a href="{% url 'single-post' post.pk %}">{{ post.title }}</a></h3>
      {% endfor %}
   </div>
   </div>
</body>

{% url ‘single-post’ post.pk %} দ্বারা ডায়নামিক url তেরী করেছি। post.pk দ্বারা <post_id> এর value দেয়া হয়েছে। ‘single-post’ বলতে বোঝাচ্ছে যে url এর name=’single-post’ তা ব্যাবহার কর।

এখন প্রতিটা পোষ্ট ক্লিক করলে ওই পোষ্টের বিস্তারিত দেখাবে।

আমরা কিছু সাধারন ভুল করে থাকি । দেখে নিন কিভাবে সমাধান করবেন

ভুল সংশোধনঃ single_post() got an unexpected keyword argument ‘post_id’ 

আগের পোষ্ট                                                                                                        পরের পোষ্ট

Leave a Reply

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