前言
最近有人私信我,问点赞的功能是如何实现出来的,可能我之前写的教程是关于前端如何实现【html、js以及css】,那么今天就来写一篇后端如何实现的吧!
回顾
如何前端不会实现的话可以参考我的文章:
Django如何简单实现点赞功能
代码实现
# 讨论点赞
def addLikes(request,id):
user = findCurrentUser(request)
# 判断 discuss_id 是否在discussions中,如果存在
try:
if Discussion.objects.get(id=id):
d = Discussion.objects.get(id=id)
if user:
record,flag = LikeNum.objects.get_or_create(user=user,discussion=d,reply=None)
if flag:
d.increase_likes()
else:
d.likes -= 1
d.save()
LikeNum.objects.get(user=user,discussion=d).delete()
return redirect('/detail/%s'%(d.id))
else:
return redirect('/login')
except Exception as e:
# 否则跳转到失败页面
return HttpResponseRedirect('/error')
# 回复点赞
def addRLikes(request,id):
user = findCurrentUser(request)
try:
if Reply.objects.get(id=id):
r = Reply.objects.get(id=id)
d = r.discussion
if user:
record,flag = LikeNum.objects.get_or_create(user=user,discussion=None,reply=r)
if flag:
r.increase_rlikes()
else:
r.rlikes -= 1
r.save()
LikeNum.objects.get(user=user,reply=r).delete()
return redirect('/detail/%s'%(d.id))
else:
return redirect('/login')
except Exception as e:
# 否则跳转到失败页面
return HttpResponseRedirect('/error')
# 浏览量增加
def addViews(request,id):
user = findCurrentUser(request)
try:
if Discussion.objects.get(id=id):
d = Discussion.objects.get(id=id)
# 讨论回复数+1
if user:
d.increase_views()
return redirect('/detail/%s'%(d.id))
except:
# 否则跳转到失败页面
return HttpResponseRedirect('/error')
# 收藏
def addFavs(request,id):
user = findCurrentUser(request)
try:
if Reply.objects.get(id=id):
r = Reply.objects.get(id=id)
d = r.discussion
if user:
record,flag = FavNum.objects.get_or_create(user=user,discussion=None,reply=r)
if flag:
r.increase_rfavs()
fav = Fav.objects.create(discussion=d,reply=r,user=user)
else:
r.rfavs -= 1
r.save()
FavNum.objects.get(user=user,reply=r).delete()
Fav.objects.get(discussion=d,reply=r,user=user).delete()
return redirect('/detail/%s'%(d.id))
else:
return redirect('/login')
except Exception as e:
# 否则跳转到失败页面
print(e)
return HttpResponseRedirect('/error')
models.py
class Data(models.Model):
question = models.CharField("问题",max_length=100,)
reply = models.CharField("回答",max_length=300)
likes = models.PositiveIntegerField('点赞数',default=0)
favs = models.PositiveIntegerField('收藏数',default=0)
created_time = models.DateTimeField("创建时间",auto_now_add=True)
updated_time = models.DateTimeField("更新时间",auto_now=True)
class Meta:
verbose_name_plural = 'Data'
def __str__(self):
return self.question
# 我的讨论
class Discussion(models.Model):
title = models.CharField("题目",max_length=30)
content = models.TextField("内容",max_length=4000)
user = models.ForeignKey(UserInfos,null=True,on_delete=models.SET_NULL)
discussion_created_time = models.DateTimeField("创建时间",auto_now_add=True)
views = models.PositiveIntegerField("浏览次数",default=0,editable=False)
likes = models.PositiveIntegerField("喜欢",default=0,editable=False)
replys = models.PositiveIntegerField("回复数",default=0,editable=False)
class Meta:
verbose_name_plural = 'Discussion'
def __str__(self):
return self.title
def increase_views(self):
self.views += 1
self.save(update_fields=['views'])
def increase_likes(self):
self.likes += 1
self.save(update_fields=['likes'])
def increase_replys(self):
self.replys += 1
self.save(update_fields=['replys'])
# 我的回复
class Reply(models.Model):
user = models.ForeignKey(UserInfos,null=True,on_delete=models.SET_NULL)
discussion = models.ForeignKey(Discussion,null=True,on_delete=models.SET_NULL)
answer = models.TextField("回答",max_length=4000,default="")
rlikes = models.PositiveIntegerField("回答喜欢数",default=0,editable=False)
rfavs = models.PositiveIntegerField("回答收藏数",default=0,editable=False)
reply_created_time = models.DateTimeField("创建时间",auto_now_add=True)
class Meta:
verbose_name_plural = 'Reply'
def __str__(self):
return self.answer
def increase_rlikes(self):
self.rlikes += 1
self.save(update_fields=['rlikes'])
def increase_rfavs(self):
self.rfavs += 1
self.save(update_fields=['rfavs'])
# 我的收藏
class Fav(models.Model):
discussion = models.ForeignKey(Discussion,null=True,on_delete=models.SET_NULL)
reply = models.ForeignKey(Reply,null=True,on_delete=models.SET_NULL)
# 回复人
user = models.ForeignKey(UserInfos,null=True,on_delete=models.SET_NULL)
class Meta:
verbose_name_plural = 'Favorite'
总结
这是之前写的代码,现在也过去了五六个月了,你要问我具体怎么搞,我也难说,还得全靠你自己琢磨,不过你那么聪明,这应该不难吧!hha!