Django博客开发拓展 | 给博客添加评论功能(后端部分)

2020年3月18日 22:19 阅读 1.93k 评论 0

数据库模型设计

昨天我们在前端中通过ajax提交了评论者姓名/昵称、email、网址、评论内容四个字段,那我们肯定在模型中肯定要包含这四个字段

from django.db import models 
from blog.models import Article 
from django.contrib.contenttypes.models import ContentType 
from django.contrib.auth.models import User 
# Create your models here. 
class Comment(models.Model): 
    # 对应的文章 
    post = models.ForeignKey(Article,on_delete=models.DO_NOTHING) 
    comment = models.TextField('评论内容') 
    name = models.CharField('评论者',max_length=20) 
    email = models.CharField('email',max_length=20) 
    url = models.CharField('网站',max_length=20,blank=True) 
    reply_time = models.DateTimeField('回复时间',auto_now_add=True) 

    class Meta(object): 
        verbose_name = '博客评论' 
        verbose_name_plural = verbose_name 

创建好模型后我们首先迁移数据库,不必多说:

python manage.py makemigrations # 创建数据库迁移文件 
python manage.py migrate #迁移数据库 

然后我们新建urls.py文件在总路由中include

编辑admin.py文件,使其可在后台编辑

from django.contrib import admin 
from .models import Comment 
# Register your models here. 

@admin.register(Comment) 
class ActicleTypeAdmin(admin.ModelAdmin): 
    list_display = ('id','name','email','url','to_user','comment','reply_time') 

再然后就是新建视图函数了

def comment_submit(request): 
    post_id = request.POST.get('post_id') #获取文章id 
    is_exist = Article.objects.get(id=post_id) #判断文章是否存在,若不存在则直接return 
    if not is_exist: 
        return JsonResponse({'code': -1, 'msg': '无此文章'}) 
    name = request.POST.get('name') 
    email = request.POST.get('email') 
    comment = request.POST.get('comment') 
    url = request.POST.get('url') 
    try:#尝试在数据库中插入数据,若失败 return 
        Comment.objects.create(comment=comment, name=name, email=email, url=url,post=is_exist) 
    except: 
        return JsonResponse({'code': -1, 'msg': '评论失败'}) 
    else: 
        time = datetime.now().timetuple()#这两行是为了去掉datetime中的前导0 
        reply_time = str(time.tm_year) + '年' + str(time.tm_mon) + '月' + str(time.tm_mday) + '日 ' + ( 
                    time.tm_hour != 0 and (str(time.tm_hour)) or ((''))) +':'+ str(time.tm_min) 
        comments = [{# 创建comment在模板中遍历 
            'name': name, 
            'comment': comment, 
            'url': url, 
            'reply_time':reply_time 
        }] 
        html = loader.render_to_string('comments.html', {'comments': comments})#渲染评论模板 
         # 将渲染完成的模板返还给前端 因为前端html拼接太麻烦,所以索性后台渲染了 
        return JsonResponse({'code': 0, 'data': html}) 

前端拿到数据后只需要在将res中的data给赋给评论div即可,比如:

    $.post({ 
        ... 
        success: function(res) { 
            //将评论模板在id为comments_list之前渲染出来,用append去了末尾,评论多的话用户以为没有评论 
            $("#comments_list").before(res.data); 
        }, 
        error: function() { 
            alert('评论失败') 
        } 
    }) 

如此这般,大功告成,只需优化逻辑,美化界面即可

至于怎么回复用户的评论,我们下次再见

最后修改于2020年3月18日 22:19
©允许规范转载

版权声明:如无特殊说明,文章均为本站原创,转载请注明出处

本文链接:https://www.yangyingqi.com/13.html

Django Python
微信
支付宝
登录后即可进行评论/回复