Creating and Showing Comments

Kategori: Python / Django , 28 Eylül 2019 , JanFranco


Yazdığımız yazılara yorum yazma özelliği ekleyelim. Bu yorumları da tarihe göre sıralayarak gösterelim. İlk olarak models.py dosyasını açalım ve Comment modeli tasarlayalım:


class Comment(models.Model):
    article = models.ForeignKey(Article, on_delete = models.CASCADE, verbose_name = "Yazı", related_name= "comments")
    comment_author = models.CharField(max_length = 50, verbose_name = "İsim")
    comment_content = models.CharField(max_length = 200, verbose_name = "Yorum")
    created_date = models.DateTimeField(auto_now_add= True, verbose_name = "Tarih")
    def __str__(self):
        return self.comment_content
article değişkenini tanımlarken related_name adında bir parametre kullandık. Bunun anlamı şudur, article.comments diyerek, veritabanında ilgili yazıyla ilgili yorumlara ulaşabiliriz. Yeni bir model oluşturduğumuz için aşağıdaki komutları çalıştıralım:


python manage.py makemigrations
python manage.py migrate
Yorumları admin panelinden kontrol edebilmek için admin.py dosyasını açalım ve ekleyelim:


from .models import Article,Comment

admin.site.register(Comment)
detail.html dosyasını açalım ve yorum bırakma formu oluşturalım:


<div class="card my-4">
    <h5 class="card-header">Yorum bırakın</h5>
    <div class="card-body" style="padding: 15px;">
	<form method="POST" action="{% url 'article:comment' article.id %}">
                {% csrf_token %}
                <label>İsim:</label>
                <div class="form-group">
                    <input type="text" class="form-control" style="width: 250px;" name="comment_author">
                </div>
                <label>Yorum:</label>
                <div class="form-group">
		    <textarea class="form-control" rows="3" name="comment_context"></textarea>
		</div>
	    <button type="submit" class="btn btn-danger" style="float: right;">Ekle</button>
	</form>
    </div>
</div>
urls.py dosyasını açalım ve aşağıdaki path'i ekleyelim:


path('comment/<int:id>', views.addComment, name = "comment"),
views.py dosyasını açalım ve addComment fonksiyonunu yazalım:


def addComment(request, id):
    article = get_object_or_404(Article, id = id)
    if request.method == "POST":
        comment_author = request.POST.get("comment_author")
        comment_context = request.POST.get("comment_context")

        newComment = Comment(comment_author = comment_author, comment_content = comment_context)
        newComment.article = article
        newComment.save()

    return redirect("/articles/article/" + str(id))
Yorumları tarihe göre sıralayarak gösterebilmek için ilk olarak views.py dosyasını açalım ve detail() fonksiyonunu aşağıdaki şekilde güncelleyelim:


def detail(request, id):
    article = get_object_or_404(Article, id = id)
    comments = article.comments.all()
    context = {
        "article": article,
        "comments": comments
    }
    return render(request, "detail.html", context)
detail.html dosyasını açalım ve ekleyelim:


<h5>Yorumlar</h5>
<br>
{% if comments %}
    {% for comment in comments %}
	<div class="media mb-4">
	    <img class="d-flex mr-3 rounded-circle" src="http://placehold.it/50x50" l>
		<div class="media-body">
		    <h5 class="mt-0">{{comment.comment_author}}</h5>
		    {{comment.comment_content}}
		    <p style="float: right;">{{comment.created_date}}</p>
		</div>
 	</div>
    {% endfor %}
{% else %}
    <div class="alert alert-danger">Henüz bir yorum bulunmuyor.</div>
{% endif %}
Yorumları sıralayabilmek için models.py dosyasını açalım ve Comment sınıfının altında bir meta sınıf tanımlayalım:


class Meta():
        ordering = ['-created_date']
Sınıfta değişiklik yaptığımız için aşağıdaki komutları çalıştıralım:


python manage.py makemigrations
python manage.py migrate


Yorumlar

Henüz bir yorum bulunmuyor.
Yorum bırakın