欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

基于Django框架利用Ajax实现点赞功能实例代码

程序员文章站 2023-11-16 11:06:04
概要: 要实现点赞功能,需要实现的有:谁进行的点赞、什么时候进行点赞、点赞的对象是谁、每一个对象的点赞数量是多少、点赞过后还需要能够取消点赞,为了是点赞后的信息能够及时的...

概要:

要实现点赞功能,需要实现的有:谁进行的点赞、什么时候进行点赞、点赞的对象是谁、每一个对象的点赞数量是多少、点赞过后还需要能够取消点赞,为了是点赞后的信息能够及时的显示在前端页面,就需要使用ajax来异步请求数据,实现实时显示。

下面话不多说了,来随着小编一起看看详细的介绍吧

模型分析:

创建的模型需要记录的数据有:点赞者、点赞对象、点赞时间、点赞的数量,由于前面三个属性主要用于记录点赞的状态,而点赞数量主要用于记录某篇文章的点赞数量,所以这里最好把点赞数量单独放在一个模型中。这里就创建了两个模型,likerecord和likecount,likerecord用于记录点赞状态,likecount用于记录点赞的数量。大致的思路图:

基于Django框架利用Ajax实现点赞功能实例代码

代码:

from django.db import models
from django.contrib.contenttypes.fields import genericforeignkey
from django.contrib.contenttypes.models import contenttype
from django.contrib.auth.models import user

# create your models here.


# 用于记录点赞数量的模型
class likecount(models.model):
 content_type = models.foreignkey(contenttype, on_delete=models.do_nothing)
 object_id = models.positiveintegerfield()
 content_object = genericforeignkey('content_type', 'object_id')
 # 用于记录点赞数量的字段
 like_num = models.integerfield(default=0)


# 用于记录点赞状态的模型
class likerecord(models.model):
 content_type=models.foreignkey(contenttype, on_delete=models.do_nothing)
 object_id=models.positiveintegerfield()
 content_object=genericforeignkey('content_type', 'object_id')
 # 记录点赞的用户
 like_user = models.foreignkey(user, on_delete=models.do_nothing)
 # 记录点赞的时间
 like_time = models.datetimefield(auto_now_add=true)

视图函数:

视图函数主要的作用就是接受前端通过ajax发送回来的数据,并且对数据进行判断处理,然后对前面的两个模型进行实例化操作已经数据变更操作,当数据成功过后返回处理后的结果,当数据存在错误时,返回相应的提示信息。

代码:

from django.shortcuts import render, httpresponseredirect
from django.contrib.contenttypes.models import contenttype
from django.http import jsonresponse
from .models import likecount, likerecord

# create your views here.


# 数据操作成功返回数据方法
def success_response(like_num):
 data = {}
 data['status'] = 'success'
 data['like_num'] = like_num
 return jsonresponse(data)


# 数据操作失败返回信息的方法
def error_response(message):
 data = {}
 data['status'] = 'error'
 data['message'] = message
 return jsonresponse(data)


def like_up(request):
 # 得到get中的数据以及当前用户
 user = request.user
 # 判断用户是否登录
 if not user.is_authenticated:
  return error_response('未登录,不能进行点赞操作')
 content_type = request.get.get('content_type')
 content_type = contenttype.objects.get(model=content_type)
 object_id = request.get.get('object_id')
 is_like = request.get.get('is_like')

 # 创建一个点赞记录
 if is_like == 'true':
  # 进行点赞,即实例化一个点赞记录
  like_record, created = likerecord.objects.get_or_create(content_type=content_type, object_id=object_id, like_user=user)
  # 通过created来判断点赞记录是否存在,如果存在则不进行点赞,如果不存在则进行点赞数量加一
  if created:
   # 不存在点赞记录并且已经创建点赞记录,需要将点赞数量加一
   like_count, created = likecount.objects.get_or_create(content_type=content_type, object_id=object_id)
   like_count.like_num += 1
   like_count.save()
   return success_response(like_count.like_num)
  else:
   # 已经进行过点赞
   return error_response('已经点赞过')
 else:
  # 取消点赞
  # 先查询数据是否存在,存在则进行取消点赞
  if likerecord.objects.filter(content_type=content_type, object_id=object_id, like_user=user).exists():
   # 数据存在,取消点赞
   # 删除点赞记录
   likerecord.objects.get(content_type=content_type, object_id=object_id, like_user=user).delete()
   # 判断对应的点赞数量数据是否存在,如果存在则对点赞数量进行减一
   like_count, create = likecount.objects.get_or_create(content_type=content_type, object_id=object_id)
   if create:
    # 数据不存在,返回错误信息
    return error_response('数据不存在,不能取消点赞')
   else:
    # 数据存在,对数量进行减一
    like_count.like_num -= 1
    like_count.save()
    return success_response(like_count.like_num)
  else:
   # 数据不存在,不能取消点赞
   return error_response('数据不存在,不能取消点赞')

ajax代码:

该段代码的主要作用:通过前端按钮触动相应的处理函数,将当前的数据传递给后端,后端接受数据后进行处理,处理完后的数据再返回给前端,通过ajax实时显示到前端。

代码:

<script type="text/javascript">
 function change_like(obj, content_type, object_id) {
  // 判断obj中是否包含active的元素,用于判断当前状态是否为激活状态
  var is_like = obj.getelementsbyclassname('active').length == 0
  $.ajax({
   url: '/like_up/',
   // 为了避免加入csrf_token令牌,所以使用get请求
   type: 'get',
   // 返回的数据用于创建一个点赞记录
   data: {
    content_type: content_type,
    object_id: object_id,
    is_like: is_like,
   },
   cache: false,
   success: function (data) {
    console.log(data);
    if (data['status'] == 'success'){
     // 更新点赞状态
     // 通过class找到对应的标签
     var record = $(obj.getelementsbyclassname('glyphicon'))
     if (is_like){
      record.addclass('active')
     }
     else {
      record.removeclass('active')
     }
     // 更新点赞数量
     var like_num = $(obj.getelementsbyclassname('like_num'))
     like_num.text('(' + data['like_num'] + ')')

    }
    else {
     // 以弹窗的形式显示错误信息
     alert(data['message'])
    }
   },
   error: function (xhr) {
    console.log(xhr)
   }
  });
  return false;
 };
</script>

最终效果图:

基于Django框架利用Ajax实现点赞功能实例代码

github源码

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对的支持。