11 评论树
1 评论树展示

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)

浙公网安备 33010602011771号