首页 > 其他分享 >django实现点赞功能

django实现点赞功能

时间:2022-11-22 16:47:39浏览次数:51  
标签:el 功能 like button django 点赞 article id

1,在文章模型中添加点赞字段,用多对多关系统计所有为文章点赞的用户。

class Article(BaseModel):
    ...
    # 为文章点赞
    users_like = models.ManyToManyField(
        settings.AUTH_USER_MODEL,
        related_name="articles_like",
        verbose_name='点赞',blank=True)

2,编写处理函数,我这里只接收了需要点赞的文章id这个参数,至于如何判断该请求是点赞还是取消赞,

则是从对应文章的users_like中查询,如果已有记录,说明点过赞,那就进行取消赞操作,如果没有记录。那就将当前用户添加到文章记录中,实现点赞操作,然后再返回当前操作类型和点赞数,供前端进行显示渲染。

class LikeArticle(View):
    """
    点赞功能
    """
    def get(self, request):
        pass

    def post(self, request):
        try:
            user = request.user
            if user.is_authenticated:
                article_id = request.POST.get('article_id')
                article = Article.objects.filter(id=article_id)
                if article.exists():
                    user_like = article[0].users_like.filter(id=user.id)
                    # 查询当前用户是否为当前文章点过赞
                    type = 1
                    if user_like.exists():
                        # 若点过,则取消
                        article[0].users_like.remove(user)
                        type = 0
                    else:
                        # 若无,则点赞
                        article[0].users_like.add(user)
                    like_sum = article[0].users_like.count()
                    return JsonResponse({'state': 200, 'type': type, 'like_sum': like_sum})
            return JsonResponse({'state': 400, 'data': '点赞无效'})
        except Exception as e:
            return JsonResponse({'state': 500, 'data': f'出现异常:{e}'})

3,编写点赞路由

urlpatterns = [
    ...
    # 为文章点赞
    path(r'like_article/',
         views.LikeArticle.as_view(),
         name="like_article"),
]

4,前端页面部分,由于文章部分是由django模板语言渲染的,就不太好用vue再定义变量实现样式和点赞数的切换,

所以决定点赞按钮的初始化还是用django,只在点赞按钮上添加点击事件,

若点击,则会传递当前按钮节点和当前文章id到函数中。

{% if article.users_like.count > 0 %}
    <el-button @click="ck_like($event,{{ article.pk }})"
    icon="el-icon-caret-top" size="mini"
    {% if user in article.users_like.all %}
        type="primary"
    {% else %}
        plain
    {% endif %}
    >赞同 {{ article.users_like.count }}</el-button>
{% else %}
    <el-button @click="ck_like($event,{{ article.pk }})"
        icon="el-icon-caret-top" size="mini" plain>赞同</el-button>
{% endif %}

5,js部分,event.currentTarget这里实际上就是按钮的对象了,拿到id发送post请求,得到结果后

直接用js就能实现改变样式或者修改内部文字,达到局部刷新的效果。

ck_like(event,id){
    let like_btn = event.currentTarget
    var url = this.host+'/like_article/'
    var data = {
        'article_id': id,
    }
    $.ajax({
        url: url,
        type: 'post',
        data: data,
        success: function (res) {
            // console.log(res)
            if(res.state==200){
                like_btn.children[1].textContent = '赞同 '+res.like_sum
                if(res.type){
                    like_btn.className = 'el-button el-button--primary el-button--mini'
                }else{
                    like_btn.className = 'el-button el-button--default el-button--mini is-plain'
                }
            }else {
                index.$message.error({
                  message: res.data,
                });
            }
        },
        error: function (res){
            index.$message.error({
              message: res.data,
            });
        }
    })  
},

总结:目前这个思路感觉还是不错的,哈哈

标签:el,功能,like,button,django,点赞,article,id
From: https://www.cnblogs.com/lishuh/p/16915580.html

相关文章

  • SpringBoot 中大文件(分片上传)断点续传与极速秒传功能的实现
    ​ 1.创建SpringBoot项目本项目采用springboot+mybatis-plus+jquery+thymeleaf组成2.项目流程图​编辑3.在pom中添加以下依赖123456789101112......
  • 第七其他功能
    硅谷通用权限系统:其他功能一、功能说明其他功能:部门管理、岗位管理、日志管理(登录日志、操作日志)1、部门管理实现方式与菜单管理类似2、岗位管理实现方式与菜单管理......
  • 直播网站源码,uni-app 数据上拉加载更多功能
    直播网站源码,uni-app数据上拉加载更多功能打开项目根目录中的pages.json配置文件,为subPackages分包中的商品goods_list页面配置上拉触底的距离:"subPackages":[ ......
  • django内置分页
    一.普通分页参考:https://blog.csdn.net/qq_37605109/article/details/1245140371.views.py中fromdjango.core.paginatorimportPaginatordefauthor_list(request......
  • 2流高手速成记(之九):基于SpringCloudGateway实现服务网关功能
    咱们接上回 上一节我们基于Sentinel实现了微服务体系下的限流和熔断,使得整个微服务架构的安全性和稳定性上升了一个台阶篇尾我们引出了一个问题,众多的微服务节点,我们如......
  • django 常用功能
    如何给viewset的request添加参数验证:首先,编写相应的serializerclassXPushSerializer(serializers.ModelSerializer):task_id=serializers.CharField(required=Fals......
  • 推荐一款高效率前端开发神器,功能太强大了 !
    当前端收到一张设计稿的时候,他们需要考虑非常多的问题。而第一个摆在面前的问题就是- ​​切图​​。作为连接设计师和前端的重要“纽带”,如果切图不准确,很容易导致最终的......
  • VC MFC 实现枚举串口号,并支持串口热插拔功能
    直接上代码头文件 全局变量声明//需要头文件#include<dbt.h>//声明全局变量staticconstGUIDGUID_DEVINTERFACE_LIST[]={//GUID_DEVINTERFACE_USB_DEV......
  • Unity 保存截图功能
    1.下面是实现代码usingSystem.Collections;usingSystem.Collections.Generic;usingUnityEditor;usingUnityEngine;publicclassSaveJPG:MonoBehaviour{......
  • django ORM之Q查询与F查询
    F对象查询与Q对象查询也是Django提供的查询方法,而且非常的简单的高效,对于一些特殊的场景需求应用起来非常的合适,在本文中我们将对这两种查询方法进行讲解,帮助大家掌握它......