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调用在前台。
请各位朋友帮我看看。
感谢!!!

阅读 5.1k
4 个回答

点赞记录表,只需要存放 对象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) 
    

多谢。正在慢慢理解这块代码。基本已解决。还有一个就是在前端html

<a onclick="likes_topic();" >点赞(点赞数)</a>

这里的点赞数怎么无刷新更新,
目前我能想到的是在文章topic的models 下建

    def get_add_likes_num(self):
        return self.new_likes.count()

然后这样调用:

<a onclick="likes_topic();" >点赞({{ topic.get_add_likes_num }})</a>

这样需要刷新一下才会看到点赞数 +1

不知道怎么让 这里点赞后无刷新更新这里?

Model 里面定义一个get_absolute_url方法,就可以实现提交后刷新数据

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题