基于Django框架利用Ajax实现点赞功能实例代码
作者:一稚杨 发布时间:2022-01-29 02:35:38
标签:django,ajax,点赞功能
概要:
要实现点赞功能,需要实现的有:谁进行的点赞、什么时候进行点赞、点赞的对象是谁、每一个对象的点赞数量是多少、点赞过后还需要能够取消点赞,为了是点赞后的信息能够及时的显示在前端页面,就需要使用Ajax来异步请求数据,实现实时显示。
下面话不多说了,来随着小编一起看看详细的介绍吧
模型分析:
创建的模型需要记录的数据有:点赞者、点赞对象、点赞时间、点赞的数量,由于前面三个属性主要用于记录点赞的状态,而点赞数量主要用于记录某篇文章的点赞数量,所以这里最好把点赞数量单独放在一个模型中。这里就创建了两个模型,LikeRecord和LIkeCount,LikeRecord用于记录点赞状态,LIkeCount用于记录点赞的数量。大致的思路图:
代码:
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>
最终效果图:
GitHub源码
来源:http://www.huangwenyang.cn/new_blog/content/?page=38
0
投稿
猜你喜欢
- 对python中的控制条件、循环和跳出详解代码缩进(代码块):python用缩进表示代码块,没有其他语言的大括号缩进是强制检查,整个代码缩进
- 一般我们可以使用背景图的方式给图片添加阴影,但对于不固定尺寸的图片如何实现呢?我们可以采取“视觉欺骗 * ”——定义渐变边框来实现运行代码框&
- jquery有一个插件叫Timer,很有意思,咱来实现一个简版的yui3的node timer。但还是应当首先交代下yui3的node扩展的
- 本文实例总结了Python实现string字符串连接的方法。分享给大家供大家参考,具体如下:以下基于python 2.7版本,代码片段真实有
- 最近在学习Golang语言,中间遇到一个前辈指点,有一个学习原则:Learning By Doing。跟我之前学习Java的经验高度契合。在
- 昨天Steve的 讲座涉及了一个我从没考虑的领域,在没法优化后台服务器的时候,如何合理的放置网页的元件让她们在浏览器里显示得更加快。这里,我
- 搭建一个oracle,下面会有很多schema,每个schema下的数据都不影响。感觉和mysql的库的概念很像,现在用的数据库管理系统其实
- 准备软件:1. J2SDK(1.5.0): jdk-1_5_0-linux-i586-rpm.bin2. Apache(2.0.53): h
- Python(包括其包Numpy)中包含了了许多概率算法,包括基础的随机采样以及许多经典的概率分布生成。我们这个系列介绍几个在机
- 我们要开始学习如何做等级划分啦。要实现这一功能,还得学习 5 个新的知识点,分别是os.path.exists()、os.mkdir()、算
- 目录项目地址功能概述效果图模块安装提交环境为python3.7 pyqt5==5.13.2 win10 一切正常!说一说大概的思路吧项目地址
- 众所周知,pip 可以安装、更新、卸载 Python 的第三方库,非常方便。你们中的许多人可能已经使用 pip 
- 从内部来看,每个session都只是一个普通的Django model(在 django.contrib.sessions.models 中
- Access 操作很简单,具体不步骤如下:打开你mdb数据库,工具-->数据库实用工具-->压缩和修复数据库(c)... SQL SERVE
- 在日常的编程中,我经常需要标识存在于文本文档中的部件和结构,这些文档包括:日志文件、配置文件、定界的数据以及格式更自由的(但还是
- PHP原型模式Prototype Pattern是什么原型模式是一种创建型模式,它可以通过复制现有对象来创建新的对象,而无需知道具体的创建过
- 求f(x) = sin(x)/x 的不定积分和负无穷到正无穷的定积分sin(x)/x 的不定积分是信号函数sig ,负无穷到正无穷的定积分为
- 1. XML简介XML(eXtensible Markup Language)指可扩展标记语言,被设计用来传输和存储数据,已经日趋成为当前许
- 最近一直在研究python+selenium+beautifulsoup的爬虫,但是存入数据库还有写入txt文件里面的时候一直都是unico
- 一直在期待这本书,一直希望国内能有一本正视WEB标准,并且全面阐述WEB标准书籍。而这本书是我觉得国内最全面的一本关于WEB标准的书籍,这本