11 评论树

1 评论树展示

image

urls.py
from django.urls import path

urlpatterns = [
    ...
    path('get_comment_tree/', views.get_comment_tree),
]

views.py
from django.http import JsonResponse
from blog import models

def get_comment_tree(request):
    article_id = request.GET.get("article_id")
    ret = models.Comment.objects.filter(article_id=article_id).values('pk', 'content', 'parent_comment_id')
    ret = list(ret)
    return JsonResponse(ret, safe=False)  # 非字典序列化必须传入safe=False

article_detail.html
    <div>
        <p class="tree_btn">评论树</p>
        <div class="comment_tree"></div>
    </div>
	
<script>
// 评论树
$('.tree_btn').click(function () {
    $.ajax({
        url: "/get_comment_tree/",
        type: 'get',
        data: {
            article_id: "{{ article_obj.pk }}"
        },
        success: function (res) {
            console.log(res);
            $.each(res, function (index, comment_obj) {
                var pk = comment_obj.pk;
                var content  = comment_obj.content;
                var parent_comment_id = comment_obj.parent_comment_id;
                var s = `<div class="comment_item" comment_id="${pk}"><span>${content}</span></div>`;
                if (!parent_comment_id){
                    $('.comment_tree').append(s);
                }else {
                    $(`[comment_id=${parent_comment_id}]`).append(s);
                }
            })

        }
    })
})
</script>

PS:根评论一定会在子评论的前面。(在数据库取数据时,order默认是从小到大排)


2 事务的应用

from django.db import transaction

def comment(request):
    article_id = request.POST.get('article_id')
    pid = request.POST.get('pid')
    content = request.POST.get('content')
    user_id = request.user.pk

    with transaction.atomic():  # 开启事务
        comment_obj = models.Comment.objects.create(user_id=user_id, article_id=article_id, content=content, parent_comment_id=pid)
        models.Article.objects.filter(pk=article_id).update(comment_count=F("comment_count")+1)

    response = {}
    response["create_time"] = comment_obj.create_time.strftime("%Y-%m-%d %X")
    response["username"] = request.user.username
    response["content"] = content

    return JsonResponse(response)

3 发送邮件

from django.core.mail import send_mail
from django.conf import settings
import threading

t = threading.Thread(target=send_mail, args=(
    "您的文章%s,新增了一条评论内容" % article_obj.title,
    content,
    settings.EMAIL_HOST_USER,
    ["mimi_dyh@163.com", ]
))
t.start()

return JsonResponse(response)
posted @ 2022-08-23 11:07  角角边  Views(25)  Comments(0)    收藏  举报