Django点赞的实现示例
作者:365JHWZGo 发布时间:2022-08-24 20:13:40
标签:Django,点赞
1.前期准备
用户models.py
class User(models.Model):
username = models.CharField("用户名",max_length=10)
点赞models.py
LikeNum的作用在于当有人点赞时可以把它记录下来,包括点赞者和点赞的内容
# 喜欢数
class LikeNum(models.Model):
user = models.ForeignKey(UserInfos,null=True,on_delete=models.SET_NULL)
discussion = models.ForeignKey(Discussion,null=True,on_delete=models.SET_NULL)
class Meta:
verbose_name_plural = 'user'
发布models.py
Discusssion的作用在于渲染前端页面,里边包括动态发布人和被点赞数量
# 我的讨论
class Discussion(models.Model):
user = models.ForeignKey(UserInfos,null=True,on_delete=models.SET_NULL)
likes = models.PositiveIntegerField("喜欢",default=0,editable=False)
class Meta:
verbose_name_plural = 'Discussion'
views.py
# 讨论点赞
def addLikes(request,id):
# 识别出该登陆者用户信息
if request.session.get('username') and request.session.get('uid'):
username = request.session.get('username')
user = UserInfos.objects.get(username=username)
else:
# error 是自己写的出错页面
return HttpResponseRedirect('/error')
# 判别点赞的该Discussion是否存在,有可能在你点赞的时候该用户已经删除,注意不能简单的使用if,else当找不到discussion时会出错
try:
if Discussion.objects.get(id=id):
# 如果Discussion存在
d = Discussion.objects.get(id=id)
# 如果User存在
if user:
# 判断当前用户是否已经给该Discussion点过赞
# record 为该记录,不存在时则自动创建
# flag 为当前是否操作
record,flag = LikeNum.objects.get_or_create(user=user,discussion=d)
# 如果刚刚创建
if flag:
d.likes+=1
d.save()
# 如果没操作,说明之前点过赞,此时再次点赞说明是要取消点赞
else:
d.likes -= 1
d.save()
# 并且删除掉点赞记录
LikeNum.objects.get(user=user,discussion=d).delete()
# 跳转到发布页面
return render(request,'page.html',{'page':Discusssion.objects.all(),'ln':LikeNum.objects.fitter(user=user)})
else:
# 如果session中没有用户信息,则跳转到登陆页面
return redirect('/login')
except Exception as e:
# 否则跳转到失败页面
return HttpResponseRedirect('/error')
2.html实现
{% for item in page %}
<div>
用户名:{{item.user.username}}
<a id="id{{item.id}}">
<svg class="icon" aria-hidden="true">
<use xlink:href="#icon-like-fill" rel="external nofollow" ></use>
</svg>
<span id="nlikes">{{item.likes}}</span>
</a>
</div>
<!-- 请把我写在这里 3.js实现 --!>
{% endfor %}
3.js实现【!!!注意这段代码写在for循环之内】
//ln指likenum【点赞数】,因为点赞记录是QuerySet,需要从里边遍历
{% if ln %}
// 遍历
{% for l in ln %}
// 当当前的discussion在LikeNum记录里时,为a标签添加一个class
{% if l.discussion == item %}
<script>
obj = document.getElementById('id{{item.id}}');
obj.className = 'success';
</script>
{% endif %}
{%endfor%}
{%endif%}
4.css实现
.success {
color: #fc5531;
text-decoration: none;
}
a {
text-decoration: none;
color: #848B96;
}
a:hover {
color: #fc5531;
}
这只是一个大概流程,具体的美化还需要自己实现,不懂得话可以留言来交流!
示意图【我自己做出来的效果】
来源:https://blog.csdn.net/qq_44833392/article/details/123234145
0
投稿
猜你喜欢
- Python语言与Perl,C和Java等语言有许多相似之处。但是,也存在一些差异。在本章中我们将来学习Python的基础语法,让你快速学会
- 1. assert函数说明:Assert statements are a convenient way to insert debuggi
- 使用runserver可以使我们的django项目很便捷的在本地运行起来,但这只能在局域网内访问,如果在生产环境部署django,就要多考虑
- 转换步骤概览准备好模型定义文件(.py文件)准备好训练完成的权重文件(.pth或.pth.tar)安装onnx和onnxruntime将训练
- 半透明效果有时候会给页面增加不少色彩,特别是Vista盛行之后,半透明效果更加受推崇。在诸多可用于Web浏览的图片格式中,只有PNG格式和G
- 文章出处:https://blog.csdn.net/sdksdk0/article/details/80933444作者:朱培
- 使用字符串创建矩阵是一个很实用的功能,之前自己尝试了很多次的小功能使用这个方法就能够简单实现。创建长度为16的字符串,是为了方便能够在各种数
- 我们在编写Python爬虫时,有时会遇到网站拒绝访问等反爬手段,比如这么我们想爬取蚂蚁短租数据,它则会提示“当前访问疑似黑客攻击,已被网站管
- Embedding的近邻搜索是当前图推荐系统非常重要的一种召回方式,通过item2vec、矩阵分解、双塔DNN等方式都能够产出训练好的use
- 转化时间类型to_datetime()方法to_datetime()方法支持将 int, float, str, datetime, lis
- 1.集合的定义集合的元素是不可重复的s = {1,2,3,1,2,3,4,5}print(s)print(type(s))s1 = {1}p
- 1 什么是嵌套循环所谓嵌套循环就是一个外循环的主体部分是一个内循环。内循环或外循环可以是任何类型,例如 while 循环或 for 循环。
- 0.摘要在Python中,尤其是数组当中,对于一些异常值往往需要进行特殊处理。为了防止异常值与正常数据混淆,影响最终计算结果,常用的方法是将
- 项目编写过程中,总能遇见对字典进行排序什么的,如果要实现多条件排序只需要下面几行代码实现。充分体现了python的好处了。teamitems
- 我们经常在处理字符串时遇到有很多空格的问题,一个一个的去手动删除不是我们程序员应该做的事情,今天这篇技巧的文章脚本之家就来给大家讲一下,如何
- 无限分类是实际开发中经常用到的一种数据结构,一般我们称之为树形结构。题设:类似淘宝的商品分类,可以在任意分类设置其子类。 一、创建
- 运行MySQL Server 5.0安装程序“setup.exe”,出现如下界面: 安装向导启动,按“Next”继续:
- 先说说线程在多线程中,为了保证共享资源的正确性,我们常常会用到线程同步技术.将一些敏感操作变成原子操作,保证同一时刻多个线程中只有一个线程在
- 核心代码function convert2utf8($string) { return iconv(&
- 从PJBlog 2.7开始,验证码的功能就很好很强大了,但是同时也给手工输入带来了不小的麻烦——经常输错。之前我写了一个《自己写的一个PJB