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,对象类型,点赞人,点赞时间
ajax调用
views.py