导读:本期聚焦于小伙伴创作的《如何使用Django和JavaScript实现流畅的点赞取消点赞功能》,敬请观看详情,探索知识的价值。以下视频、文章将为您系统阐述其核心内容与价值。如果您觉得《如何使用Django和JavaScript实现流畅的点赞取消点赞功能》有用,将其分享出去将是对创作者最好的鼓励。

实现无刷新的点赞取消点赞功能,核心是通过Django处理后端数据逻辑,JavaScript发送异步请求更新前端状态,避免整页重载带来的卡顿感。整个流程分为后端数据层、接口层、前端交互层三个部分,下面逐步展开说明。

如何使用Django和JavaScript实现流畅的点赞取消点赞功能

一、后端数据模型设计

首先需要设计存储点赞数据的数据表,这里需要两个核心模型:内容模型和点赞记录模型。假设我们要对文章实现点赞功能,先定义文章模型,再定义点赞记录模型,通过外键关联文章和用户,同时设置联合唯一约束避免重复点赞。

from django.db import models
from django.contrib.auth.models import User

# 文章模型
class Article(models.Model):
    title = models.CharField(max_length=200, verbose_name="文章标题")
    content = models.TextField(verbose_name="文章内容")
    like_count = models.IntegerField(default=0, verbose_name="点赞数")
    created_at = models.DateTimeField(auto_now_add=True, verbose_name="创建时间")

    def __str__(self):
        return self.title

# 点赞记录模型
class LikeRecord(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE, verbose_name="点赞用户")
    article = models.ForeignKey(Article, on_delete=models.CASCADE, verbose_name="点赞文章")
    created_at = models.DateTimeField(auto_now_add=True, verbose_name="点赞时间")

    class Meta:
        # 联合唯一约束,同一用户同一文章只能有一条点赞记录
        unique_together = ("user", "article")

二、Django后端接口开发

后端需要提供两个核心接口:一个是获取文章当前点赞状态和点赞数的查询接口,另一个是实现点赞和取消点赞的切换接口。接口使用Django的视图函数处理,返回JSON格式数据供前端调用。

2.1 查询点赞状态接口

该接口接收文章ID和用户ID,返回当前用户是否点赞过该文章,以及文章的总点赞数。

from django.http import JsonResponse
from django.views.decorators.http import require_GET
from .models import Article, LikeRecord

@require_GET
def get_like_status(request):
    article_id = request.GET.get("article_id")
    user = request.user
    if not user.is_authenticated:
        return JsonResponse({"code": 401, "msg": "请先登录"})
    try:
        article = Article.objects.get(id=article_id)
    except Article.DoesNotExist:
        return JsonResponse({"code": 404, "msg": "文章不存在"})
    # 判断是否已点赞
    is_liked = LikeRecord.objects.filter(user=user, article=article).exists()
    return JsonResponse({
        "code": 200,
        "data": {
            "is_liked": is_liked,
            "like_count": article.like_count
        }
    })

2.2 点赞切换接口

该接口处理点赞和取消点赞的切换逻辑:如果用户未点赞则创建点赞记录,文章点赞数加1;如果用户已点赞则删除点赞记录,文章点赞数减1。

from django.views.decorators.http import require_POST
from django.views.decorators.csrf import csrf_exempt
import json

@require_POST
@csrf_exempt
def toggle_like(request):
    data = json.loads(request.body)
    article_id = data.get("article_id")
    user = request.user
    if not user.is_authenticated:
        return JsonResponse({"code": 401, "msg": "请先登录"})
    try:
        article = Article.objects.get(id=article_id)
    except Article.DoesNotExist:
        return JsonResponse({"code": 404, "msg": "文章不存在"})
    # 查询是否已有点赞记录
    like_record = LikeRecord.objects.filter(user=user, article=article).first()
    if like_record:
        # 已点赞,执行取消点赞
        like_record.delete()
        article.like_count -= 1
        article.save()
        is_liked = False
    else:
        # 未点赞,执行点赞
        LikeRecord.objects.create(user=user, article=article)
        article.like_count += 1
        article.save()
        is_liked = True
    return JsonResponse({
        "code": 200,
        "data": {
            "is_liked": is_liked,
            "like_count": article.like_count
        }
    })

记得在Django的urls.py中配置这两个接口的路由,确保前端可以正常访问。

三、前端交互逻辑实现

前端部分需要使用JavaScript发送ajax请求,处理点赞按钮的点击事件,同时更新按钮样式和点赞数显示,整个过程不需要刷新页面。

3.1 页面HTML结构

页面中需要放置点赞按钮和点赞数显示元素,这里用一个简单的文章详情页示例。

<div class="article-detail">
    <h3>示例文章标题</h3>
    <p>这是文章的内容部分,这里展示文章的详细信息。</p>
    <div class="like-area">
        <button id="likeBtn" data-article-id="1">
            <span id="likeIcon">♡</span>
            <span id="likeCount">0</span>
        </button>
    </div>
</div>

3.2 JavaScript交互代码

代码分为两部分:页面加载时查询当前点赞状态,点击按钮时发送切换点赞请求并更新界面。

// 页面加载完成后初始化点赞状态
document.addEventListener("DOMContentLoaded", function() {
    const articleId = document.getElementById("likeBtn").dataset.articleId;
    // 发送请求获取点赞状态
    fetch(`/api/get_like_status/?article_id=${articleId}`, {
        method: "GET",
        headers: {
            "Content-Type": "application/json"
        },
        credentials: "include" // 携带cookie,确保用户登录状态有效
    })
    .then(response => response.json())
    .then(res => {
        if (res.code === 200) {
            updateLikeUI(res.data.is_liked, res.data.like_count);
        } else {
            alert(res.msg);
        }
    });

    // 点赞按钮点击事件
    document.getElementById("likeBtn").addEventListener("click", function() {
        const articleId = this.dataset.articleId;
        fetch("/api/toggle_like/", {
            method: "POST",
            headers: {
                "Content-Type": "application/json"
            },
            body: JSON.stringify({
                article_id: articleId
            }),
            credentials: "include"
        })
        .then(response => response.json())
        .then(res => {
            if (res.code === 200) {
                updateLikeUI(res.data.is_liked, res.data.like_count);
            } else {
                alert(res.msg);
            }
        });
    });
});

// 更新点赞按钮样式和点赞数的工具函数
function updateLikeUI(isLiked, likeCount) {
    const likeIcon = document.getElementById("likeIcon");
    const likeCountEl = document.getElementById("likeCount");
    if (isLiked) {
        likeIcon.textContent = "♥";
        likeIcon.style.color = "red";
    } else {
        likeIcon.textContent = "♡";
        likeIcon.style.color = "#999";
    }
    likeCountEl.textContent = likeCount;
}

四、优化与注意事项

在实际使用中可以对功能做进一步优化:比如添加请求防抖,避免用户快速多次点击发送重复请求;前端添加加载状态提示,提升用户体验;后端可以对接口做限流,防止恶意刷点赞数。另外需要注意用户未登录时的处理逻辑,前端可以引导用户跳转到登录页面,后端接口也要做好权限校验,避免未登录用户操作数据。

整个点赞功能的实现逻辑并不复杂,核心就是前后端通过异步请求交互,后端保证数据的一致性,前端保证交互的流畅性,按照上述步骤即可快速搭建出符合需求的点赞模块。

DjangoJavaScript点赞功能ajax修改时间:2026-07-14 11:39:43

免责声明:​ 已尽一切努力确保本网站所含信息的准确性。网站内容多为原创整理与精心编撰,观点力求客观中立。本站旨在免费分享,内容仅供个人学习、研究或参考使用。若引用了第三方作品,版权归原作者所有。如内容涉及您的权益,请联系我们处理。
内容垂直聚焦
专注技术核心技术栏目,确保每篇文章深度聚焦于实用技能。从代码技巧到架构设计,为用户提供无干扰的纯技术知识沉淀,精准满足专业提升需求。
知识结构清晰
覆盖从开发到部署的全链路。AI、前端、编程、数据库、服务器、建站、系统层层递进,构建清晰学习路径,帮助用户系统化掌握开发与运维所需的核心技术。
深度技术解析
拒绝泛泛而谈,深入技术细节与实践难点。无论是数据库优化还是服务器配置,均结合真实场景与代码示例进行剖析,致力于提供可直接应用于工作的解决方案。
专业领域覆盖
精准对应开发生命周期。从前端界面到后端编程,从数据库操作到服务器运维,形成完整闭环,一站式满足全栈工程师和运维人员的技术需求。
即学即用高效
内容强调实操性,步骤清晰、代码完整。用户可根据教程直接复现和应用于自身项目,显著缩短从学习到实践的距离,快速解决开发中的具体问题。
持续更新保障
专注既定技术方向进行长期、稳定的内容输出。确保各栏目技术文章持续更新迭代,紧跟主流技术发展趋势,为用户提供经久不衰的学习价值。