১১-৬ : ইম্প্লিমেন্টিং কমেন্ট পার্ট ১

এই মডিউলে দেখব কিভাবে পোস্টের জন্য কমেন্ট এ্যাড করা যায়।

প্রথমেই Comment মডেল ক্রিয়েট করে ফেলি-

Code:: 11.6.1 posts/models.py

...
...
...

class Comment(models.Model):
    post = models.ForeignKey(Post, on_delete=models.CASCADE, related_name='comments')
    name = models.CharField(max_length=30)
    email = models.EmailField()
    body = models.TextField()
    created_on = models.DateTimeField(auto_now_add=True)
    
    def __str__(self):
        return f"Comments by {self.name}"
        
  • মডেলে post নামে ForeignKey ফিল্ড এ্যাড করে Post মডেলের সাথে One to Many রিলেশনশিপ তৈরি করা হয়েছে, রিলেশনশিপটি Comment মডেলে তৈরি করা হয়েছে যেন একটি Post এর জন্য একাধিক Comment অ্যাাড করা যায়।

নতুন মডেল তৈরি করা হয়েছে, অতএব makemigrations, migrate কমান্ড রান করতে হবে

Comment মডেলের জন্য মডেলফর্ম তৈরি করে ফেলি-

Code:: 11.6.2 posts/forms.py

...
...
...

class CommentForm(forms.ModelForm):
    class Meta:
        model = Comment
        fields = ['name', 'email', 'body']
        

কমেন্ট করার ও কমেন্টস দেখার সুবিধাটি ডিটেইলস পোস্ট সেকশনে রাখতে চাচ্ছি । DetailPostView নিচের মত করে লিখে ফেলি-

Code:: 11.6.3 posts/views.py

...
...
...

class DetailPostView(DetailView):
    model = models.Post
    pk_url_kwarg = 'id'
    template_name = 'post_details.html'
    
    def post(self, request, *args, **kwargs):
        comment_form = forms.CommentForm(data=self.request.POST)
        post = self.get_object()
        if comment_form.is_valid():
            new_comment = comment_form.save(commit=False)
            new_comment.post = post
            new_comment.save()
        return self.get(request, *args, **kwargs)
    
    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        post = self.object # post model er object ekhane store korlam
        comments = post.comments.all()
        comment_form = forms.CommentForm()
        
        context['comments'] = comments
        context['comment_form'] = comment_form
        return context
        

post( ) ফাংশনে CommentForm-এ পোস্ট করা ডেটা ডেটাবেজে সেভ করা হয়েছে । get_context_data( ) ফাংশনে CommentForm ও CommentForm এর ডেটা context আকারে রিটার্ন করা হয়েছে।

CommentForm ও CommentForm এর ডেটা দেখানোর জন্য post_details.html ফাইল নিচের মত করে লিখে ফেলি-

Code:: 11.6.3 posts/templates/post_details.html

{% extends 'base.html' %}
{% load crispy_forms_tags %}
{% block content %}
<div class="col-12">
    <div class="card m-2">
        <div class="card-body">
            <img src="{{post.image.url}}" class="card-img-top" alt="..." style="width:50%;">
            <h1 class="card-title">{{post.title}}</h1>
            <p class="card-text">{{post.content}}</p>
            <p>Author : {{post.author.first_name}} {{post.author.last_name}}</p>
            <p>
                Category : {% for cat in post.category.all %}
                <button class="btn btn-warning btn-sm m-2" disabled>
                    {{cat.name}}
                </button>
                {% endfor %}
            </p>
        </div>
    </div>
</div>

<div class="card m-2">
    <h5 class="p-3">Total Comments : {{comments | length}}</h5>
    {% for comment in comments %}
  <div class="card-body border m-2">
        <p><b>{{comment.name}}</b> {{comment.created_on}}</p>
        <p>{{comment.body}}</p>
    </div>
    {% endfor %}
</div>
<div class="card m-2">
    <div class="card-body">
        <form method="post">
            <h1>Add Comment</h1>
            {% csrf_token %}
            {{comment_form | crispy}}

            <button class="btn btn-warning">Submit</button>
    </div>
</div>
{% endblock %}

প্রজেক্ট রান করে ডিটেইল ভিউ তে গেলে পোস্টের জন্য কমেন্ট ও কমেন্ট করার ফর্ম দেখতে পাব-

Last updated