মডিউল ৭-৯ঃ পোস্ট এডিট করা

ডেটাবেজে এক্সিস্টিং পোস্ট এডিট করে এডিটেড ডেটা ডেটাবেজে সেভ করার জন্য যে Post Object বা instance বা Record টি এডিট করতে চাচ্ছি তার ডেটা PostForm এর মাধ্যমে ফ্রন্ট-এন্ডে পাঠাতে হবে , তারপর সাবমিটেড ফর্ম ডেটা ডেটাবেজে সেভ করতে হবে ।

পোস্ট এডিট করার জন্য নতুন একটি URL-প্যাটার্ন এ্যাড করি

Code:: 7.9.1 posts/urls.py

from django.contrib import admin
from django.urls import path, include
from . import views
urlpatterns = [
    path('add/', views.add_post, name='add_post'),
    path('edit/<int:id>', views.edit_post, name='edit_post'),
]

৭ নং লাইনে এ্যাড করা URL-প্যাটার্নের মাধ্যমে edit_post( ) ফাংশনে একটি int প্যারামিটার পাঠানো হয়েছে। edit_post( ) ফাংশন লিখে ফেলি-

Code:: 7.9.2 posts/views.py

from django.shortcuts import render, redirect
from . import forms
from . import models
# Create your views here.

def add_post(request):
    if request.method == 'POST': # user post request koreche
        post_form = forms.PostForm(request.POST)
        if post_form.is_valid():
            post_form.save()
            return redirect('add_post')
    
    else: # user normally website e gele blank form pabe
        post_form = forms.PostForm()
    return render(request, 'add_post.html', {'form' : post_form})

def edit_post(request, id):
    post = models.Post.objects.get(pk=id) 
    post_form = forms.PostForm(instance=post)
    # print(post.title)
    if request.method == 'POST': # user post request koreche
        post_form = forms.PostForm(request.POST, instance=post) # user er post request data ekhane capture korlam
        if post_form.is_valid(): # post kora data gula amra valid kina check kortechi
            post_form.save() # jodi data valid hoy taile database e save korbo
            return redirect('homepage') # sob thik thakle take add author ei url e pathiye dibo
    
    return render(request, 'add_post.html', {'form' : post_form})
  • ১৮ নং লাইনে get( ) ফাংশনে pk ফিল্ডের ভ্যালু হিসেবে id কে পাঠিয়ে নির্দিষ্ট একটি Post Object এর ডেটা post ভেরিয়েবলে পেয়েছি। একটা প্রশ্ন আসা খুব স্বাভাবিক, Post মডেলে তো কোনো pk ফিল্ডই নাই, তাহলে pk ফিল্ডের জন্য ডেটা পাঠালাম কিভাবে? উত্তর হলো - যদি কোনো মডেলে প্রাইমারি কী হিসেবে কোনো ফিল্ডকে স্পেসিফাই করে না দেয়া হয় সেক্ষেত্রে জ্যাংগো নিজে থেকে pk নামে একটা প্রাইমারি কী ফিল্ড তৈরি করে নেয়।

  • পরের লাইনে post_form ভেরিয়েবলে একটি PostForm রাখা হয়েছে যার স্ব স্ব ফিল্ডে নির্দিষ্ট Post Object - 'post' এর ডেটা রয়েছে, এ কাজটি করা হয়েছে instance এর ভ্যালু post পাঠিয়ে।

templates/home.html ফাইলে প্রতিটি পোস্টের জন্য একটি <a> ট্যাগ এ্যাড করি -

Code:: 7.9.3 templates\home.html

{% extends 'base.html' %} {% block content %}

<div class="d-flex flex-wrap justify-content-center px-5 pt-5">
  {% for post in data %}
  <div class="col-sm-3">
    <div class="card m-2">
      <div class="card-body">
        <h5 class="card-title">{{post.title}}</h5>
        <p class="card-text">{{post.content}}</p>
        <p>Author : {{post.author.name}}</p>
        <p>
          Category : {% for cat in post.category.all %} 
          <button class="btn btn-primary btn-sm m-2" disabled >{{cat.name}} </button>
          {% endfor %}
        </p>
        <a href="{% url 'edit_post' post.id %}" class="btn btn-warning">Edit</a>
      </div>
    </div>
  </div>
  {% endfor %}
</div>
{% endblock %}

এখন প্রজেক্ট রান করলে প্রতিটি পোস্টের জন্য একটি এডিট বাটন দেখতে পাবো যেখানো ক্লিক করে নির্দিষ্ট পোস্টটি এডিট করা যাবে।

Last updated