javascript - django + ajax 开发给文章点赞功能遇到的问题

查看:76
本文介绍了javascript - django + ajax 开发给文章点赞功能遇到的问题的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

问 题

django 1.11 python 2.7
开发了一个给文章与评论点赞的功能。
下面的是代码:

models:

class New_Likes(models.Model):
    likes_num = models.IntegerField(default = 0) #点赞数
    author = models.ForeignKey(settings.AUTH_USER_MODEL) #点赞用户
    pub_date = models.DateTimeField(auto_now_add=True) #点赞时间
    #用了ContentType, 主要是针对文章(Topic), 评论(Reply)点赞
    content_type = models.ForeignKey(ContentType)
    object_id = models.IntegerField()
    content_object = GenericForeignKey('content_type', 'object_id')
    
    
    def __unicode__(self):
        return u'%s:%s%s' % (self.content_type, self.object_id, self.likes_num)

view.py里面:

@login_required
@csrf_exempt
def Add_New_Likes(request, pk_id, obj_type):

    # pk_id = request.GET.get('pk_id')
    # obj_type = request.GET.get('obj_type')
    user = request.user
    ret = {'dataa':None , 'status':False}
    c = ContentType.objects.get(model = obj_type)
    #这个 try 是看看这个模型(如文章Topic),id 有没有其它用户给点过赞。
    #如果有的话把赞数取出来。作为下面新用户点赞数+1 并存到数据库里。
    #作为前台调用用。但是这里的点赞数,一直反回不对。
    try:
        nnew_likes = New_Likes.objects.filter(content_type=c, object_id = pk_id)
        likes_num = nnew_likes[0].likes_num
        print ('nnew_likes', likes_num)
    except:
        likes_num = 0

    try:
        #这里如果能得到new_lies 说明该用户已经点赞过,
        #那么赞数不再增加直接反回给前端,以json的格式反回,这里的点赞数,一直反回不对
        new_likes = New_Likes.objects.get(content_type=c, object_id = pk_id, author = user)
        ret['dataa'] =  new_likes.likes_num
        ret['status'] = 1
        return JsonResponse(ret)
    
    except Exception, e:
        #如果当前用户没有对该文章点赞,那么就新建一个赞,
        #并让赞数+1,以json格式反回前端,  
        new_likes = New_Likes(content_type = c, object_id = pk_id, author = user)
        new_likes.likes_num  = likes_num + 1
        new_likes.save()

        ret['dataa'] = new_likes.likes_num
        ret['status'] = 0
        return JsonResponse(ret)    

urls.py:

url(r'^new_addlikes/(?P<pk_id>\d+)/(?P<obj_type>[\w+]+)/$', Add_New_Likes, name = 'add_new_likes'),

前端js+html代码是这样的:里面假设给文章(Topic)点赞

<a onclick="likes_topic();" >点赞</a>
//问题:这里一般点赞后面都跟着一个,点赞数量,
//而且是实时出来的。不知道怎么调出来的?

<script type="text/javascript">
function likes_topic(){
       $.ajax({
            type:'POST',
            url:'{% url "bbs:add_new_likes" topic.id "topic" %}',
            data:{'pk_id':{{topic.id}}, 'obj_type': 'topic'},
            dataType:'json',
            processData:false,  // 告诉jquery不转换数据
            contentType:false,  // 告诉jquery不设置内容格式
            success:function(data, status){
                if(data.status == 1){
                        alert('已经赞过!');
                    }
                else{
                    alert('点赞成功!');
                    }
                }
    });
    
}
</script>

以上是我写的。代码的功能也是我看了别人的代码自已想像的。至于功能我都写在上面注释里了,但是实际情况并不是像我想的那样。点赞数,一直反回的不对!

上面代码可能有很多逻辑错误。由于自已能力有现。不知怎么能正常实现点赞功能并用ajax调用在前台。
请各位朋友帮我看看。
感谢!!!

解决方案

点赞记录表,只需要存放 对象ID,对象类型,点赞人,点赞时间

class New_Likes(models.Model):
    object_id = models.IntegerField()
    content_type = models.ForeignKey(ContentType)
    author = models.ForeignKey(settings.AUTH_USER_MODEL) #点赞用户
    pub_date = models.DateTimeField(auto_now_add=True) #点赞时间
    

ajax调用

<script type="text/javascript">
function likes_topic(){
       $.ajax({
            type:'POST',
            url:'/bbs/new_addlikes/{{topic.id}}/topic',
            dataType:'json',
            success:function(data, status){
                if(data.status == 1){
                        alert('点赞成功, 当前帖子总赞数:' + data.likes_num);
                    }
                else{
                    alert('点赞失败, 错误信息:' + data.msg);
                    }
                }
    });
    
}
</script>

views.py

@login_required
@csrf_exempt
def Add_New_Likes(request, pk_id, obj_type):
    user = request.user
    ret = {'status': 0, 'msg': ''}
    c = ContentType.objects.get(model = obj_type)
    params = dict(content_type=c, object_id=pk_id, author=user)
    try:
        new_likes = New_Likes.objects.get(**params)
        ret['msg'] = '该用户已经赞过,不要重复点赞'
    except New_Likes.DoesNotExist: 
        New_Likes(**params).save()
        ret['likes_num'] = New_Likes.objects.filter(content_type=c, object_id=pk_id).count()
        ret['status'] = 1
        
    return JsonResponse(ret) 
    

这篇关于javascript - django + ajax 开发给文章点赞功能遇到的问题的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆