使用 Django 和 JavaScript 实现平滑的点赞/取消点赞功能

使用 django 和 javascript 实现平滑的点赞/取消点赞功能

本文旨在提供一个清晰、高效的教程,指导开发者如何使用 Django 框架和 JavaScript 实现点赞和取消点赞功能,并解决常见问题,例如图标切换不正确和点赞计数错误。我们将优化数据处理方式,采用更简洁的 JavaScript 代码,并提供完整的示例,确保功能的流畅性和用户体验。

优化模型关系

虽然问题重点不在模型,但优化模型关系可以提高效率。使用 ManyToManyField 可以简化点赞/取消点赞的处理。

from django.db import modelsfrom django.contrib.auth.models import Userclass Post(models.Model):    # 其他字段    likes = models.ManyToManyField(User, related_name='liked_posts', blank=True)    def __str__(self):        return self.title    def number_of_likes(self):        return self.likes.count()

视图函数改进

视图函数负责处理用户请求和数据交互。以下是优化后的视图函数:

from django.shortcuts import render, get_object_or_404from django.http import JsonResponsefrom .models import Postfrom django.contrib.auth.decorators import login_required@login_requireddef post_list(request):    posts = Post.objects.all()    return render(request, 'network/index.html', {'posts': posts})@login_requireddef like_unlike_post(request, post_id):    post = get_object_or_404(Post, id=post_id)    user = request.user    if user in post.likes.all():        post.likes.remove(user)        liked = False    else:        post.likes.add(user)        liked = True    return JsonResponse({'liked': liked, 'likes_count': post.number_of_likes()})

说明:

立即学习“Java免费学习笔记(深入)”;

get_object_or_404 简化了获取帖子的逻辑,如果帖子不存在,会返回 404 错误。login_required 装饰器确保只有登录用户才能点赞/取消点赞。通过检查用户是否在 post.likes.all() 中来判断用户是否已点赞。返回 JsonResponse,包含 liked 状态和点赞总数,方便前端更新。

URL 配置

配置 URL 映射到对应的视图函数:

from django.urls import pathfrom . import viewsurlpatterns = [    path('', views.post_list, name='post_list'),    path('like_unlike//', views.like_unlike_post, name='like_unlike_post'),]

前端 HTML 模板

HTML 模板负责展示帖子列表和点赞/取消点赞按钮。

{% for post in posts %}    

{{ post.title }}

{{ post.content }}

Seed-TTS
Seed-TTS

Seed-TTS 是一个高质量多功能的文本到语音生成模型

Seed-TTS 909
查看详情 Seed-TTS
{% endfor %}

说明:

立即学习“Java免费学习笔记(深入)”;

data-post-id 属性用于存储帖子 ID,方便 JavaScript 获取。根据用户是否已点赞,显示不同的图标和文字。like-count 类用于标识点赞计数元素,方便 JavaScript 更新。

JavaScript 代码优化

JavaScript 代码负责处理点赞/取消点赞的异步请求和页面更新。

document.addEventListener('DOMContentLoaded', function() {    document.querySelectorAll('.like-button').forEach(button => {        button.onclick = function() {            const postId = this.dataset.postId;            fetch(`/like_unlike/${postId}/`)            .then(response => response.json())            .then(data => {                const likeCountSpan = this.parentNode.querySelector('.like-count');                likeCountSpan.textContent = `Likes: ${data.likes_count}`;                if (data.liked) {                    this.innerHTML = ' Unlike';                } else {                    this.innerHTML = ' Like';                }            });        }    });});

说明:

立即学习“Java免费学习笔记(深入)”;

使用 DOMContentLoaded 确保在页面加载完成后执行 JavaScript 代码。使用 querySelectorAll 获取所有点赞按钮。使用 dataset.postId 获取帖子 ID。根据服务器返回的 liked 状态,更新按钮的图标和文字。直接更新 like-count 元素的文本内容,显示最新的点赞数。

总结

通过以上步骤,可以实现一个流畅、高效的点赞/取消点赞功能。 关键点包括:

模型优化: 使用 ManyToManyField 简化数据关系。视图函数: 使用 get_object_or_404 和 login_required 装饰器。前端代码: 使用 dataset 属性和简洁的 JavaScript 代码。

注意事项:

确保已安装 Font Awesome 图标库,并在 HTML 模板中引入。根据实际情况调整 CSS 样式,美化页面。可以添加错误处理机制,例如在请求失败时显示错误消息。对于大型项目,可以考虑使用 Django REST Framework 构建 API,提供更灵活的数据接口。

以上就是使用 Django 和 JavaScript 实现平滑的点赞/取消点赞功能的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1523455.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年12月20日 15:56:10
下一篇 2025年12月20日 15:56:26

相关推荐

  • JavaScript:访问具有相同类名的表单内的元素

    本文旨在解决在包含多个表单的网页中,如何使用 JavaScript 准确访问特定表单内的元素,尤其是当不同表单中的元素具有相同的类名时。文章将通过示例代码详细讲解如何通过表单的 ID 来定位表单,并获取表单内特定类名的元素的值。同时,也会介绍一些调试技巧,帮助开发者更好地理解和排查问题。 在构建复杂…

    2025年12月20日 好文分享
    000
  • 优化 React 组件中的条件判断:减少 if-else 语句的使用

    本文旨在帮助开发者优化 React 组件中大量 if-else 语句的使用,通过采用更简洁的数据结构和 JavaScript 特性,如对象字面量和 ??= 空值合并赋值运算符,来提高代码的可读性和可维护性。我们将通过一个实际的 React 组件案例,展示如何将复杂的条件判断逻辑简化为更优雅的实现方式…

    2025年12月20日
    000
  • 优化 React 代码中的 If-Else 结构:更简洁的条件处理方案

    本文旨在帮助开发者优化React代码中大量的if-else语句,提供使用对象字面量和三元运算符等方法,以实现更简洁、更易于维护的代码。通过具体的代码示例,展示如何将复杂的条件判断逻辑转换为更优雅的实现方式,提高代码的可读性和效率。 在编写 React 应用时,经常会遇到需要根据不同的条件执行不同逻辑…

    2025年12月20日
    000
  • 网页表单验证:确保必填字段完整性的 JavaScript 教程

    本文旨在解决 JavaScript 表单验证中常见的逻辑错误,并提供一种简单有效的验证方法。通过修改原有的验证逻辑,避免了不必要的复杂判断,简化代码,并确保在必填字段为空时阻止表单提交,从而提高用户体验和数据质量。本文将提供修正后的代码示例,并解释其工作原理,帮助开发者更好地理解和应用表单验证技术。…

    好文分享 2025年12月20日
    000
  • 在富文本编辑器中,如何利用 JavaScript 处理选区范围和内容格式?

    答案:JavaScript通过Selection和Range API实现富文本编辑功能。使用window.getSelection()获取选区,range.surroundContents()包裹内容实现加粗等格式,注意跨节点选区需先extractContents();插入内容时用insertNod…

    2025年12月20日
    000
  • 如何利用 JavaScript 实现一个支持快捷键操作的富文本编辑器?

    答案:通过contenteditable结合keydown事件监听实现快捷键操作,使用document.execCommand执行加粗、斜体、下划线、插入链接等命令,支持Ctrl/Cmd组合键触发,可扩展对齐、列表、标题等功能,并建议后续迁移至现代API或使用专业库优化兼容性与功能。 要实现一个支持…

    2025年12月20日
    000
  • Redux Dispatch 无效:状态未更新的调试与解决方案

    本文旨在帮助开发者诊断和解决 Redux 应用中 dispatch action 后状态未更新的问题。通过分析常见的错误配置和代码陷阱,提供逐步排查和修复的指导,确保 Redux 状态管理的正确性和可靠性。本文将通过一个实际案例,深入剖析问题原因,并提供详细的解决方案,助力开发者构建稳定高效的 Re…

    2025年12月20日
    000
  • Redux Dispatch 未更新 State 的问题排查与解决

    本文旨在帮助开发者排查和解决 Redux dispatch 未能正确更新 state 的问题。通过分析常见原因,例如 reducer 中的 state 访问错误、dispatch 参数错误等,并提供相应的代码示例和调试技巧,确保 Redux 状态管理的正确性。本文将通过一个实际案例,深入探讨问题根源…

    2025年12月20日
    000
  • Vue.js中JSON数据邮件地址搜索与表格展示教程

    本教程详细介绍了如何在Vue.js应用中,对JSON数据源进行邮件地址搜索。我们将利用JavaScript的Array.prototype.find()方法高效定位匹配的邮件地址对象,并将其结果动态绑定到Vue.js的网格表格中,实现数据的筛选与展示。 理解JSON数据中的邮件地址搜索需求 在现代w…

    2025年12月20日
    000
  • 如何在 ReactJS 18 的类组件中访问 props.children

    本文针对 ReactJS 18 中类组件访问 props.children 时可能遇到的 TypeScript 类型问题,提供了清晰的解决方案。通过正确定义组件的 Props 类型,显式声明 children 属性,可以避免类型检查错误,并确保在类组件中正常使用 props.children。文章还…

    2025年12月20日
    000
  • Redux Dispatch 无效:状态未更新问题排查与解决方案

    本文旨在解决 Redux 应用中 dispatch 函数调用后状态未更新的问题。通过分析常见原因,例如 reducer 中的状态更新方式错误,以及 dispatch 调用时传递的参数不正确等,提供详细的排查步骤和解决方案,帮助开发者快速定位并修复问题,确保 Redux 状态管理的正确性。 在 Red…

    2025年12月20日
    000
  • Vue.js中实现JSON数据电子邮件搜索及表格展示教程

    本教程将指导您如何在Vue.%ignore_a_1%应用中高效地搜索存储在JSON对象数组中的特定电子邮件地址,并将匹配到的数据精准地呈现在网格表格中。我们将利用JavaScript的Array.prototype.find()方法,结合Vue的数据响应式机制,实现一个简洁且功能完善的搜索功能。 1…

    2025年12月20日
    000
  • JavaScript实现表单提交前用户确认与阻止

    本教程详细讲解如何使用JavaScript在用户提交表单前弹出确认对话框。我们将探讨如何正确监听表单的submit事件,并利用confirm()函数获取用户选择。当用户选择取消时,通过event.preventDefault()方法有效阻止表单的默认提交行为,确保数据提交的准确性和用户体验。 1. …

    2025年12月20日
    000
  • Redux Dispatch 不更新状态问题排查与解决

    本文旨在帮助开发者解决 Redux 中 dispatch 无法更新状态的问题。通过分析常见的错误原因,例如 reducer 中的状态更新方式,以及 action payload 的传递,提供详细的排查步骤和解决方案,确保 Redux 状态的正确更新。 当你在 React 应用中使用 Redux 时,…

    2025年12月20日 好文分享
    000
  • Redux Dispatch 不更新状态的排查与解决

    本文旨在帮助开发者诊断和解决 Redux 应用中 dispatch 函数调用后状态未更新的问题。通过分析常见的错误配置和代码实现,提供逐步排查方案和修正建议,确保 Redux 状态管理的正确性和可靠性。 在 Redux 应用开发中,dispatch 函数用于触发状态变更,如果 dispatch 调用…

    2025年12月20日
    000
  • 在Vue.js中实现JSON对象邮箱地址搜索并展示到表格

    本文详细介绍了如何在Vue.js应用中,高效地从JSON数据集合中搜索特定邮箱地址,并将匹配到的单一用户数据展示到前端表格。核心方法是利用JavaScript的Array.prototype.find()函数进行精准查找,并提供了详细的Vue.js代码示例、处理多结果的filter()方法,以及关于…

    2025年12月20日
    000
  • 使用 Sequelize 进行关联查询时,排序混乱问题排查与解决

    本文旨在解决在使用 Sequelize 进行关联查询时,由于关联表数据未排序,导致主表数据排序出现混乱的问题。我们将深入探讨问题产生的原因,并提供一种通过指定更明确的排序规则来解决该问题的方案,确保数据在每次查询时都以一致的顺序返回。 问题分析 在使用 Sequelize 进行关联查询时,特别是涉及…

    2025年12月20日
    000
  • 基于 Sequelize 的多条件排序导致 UI 刷新异常的解决方案

    在使用 Sequelize 进行数据查询时,多条件排序可能会导致 UI 刷新出现异常,例如数据顺序错乱。这是因为在包含关联模型且关联模型也参与排序的情况下,如果关联模型的数据没有明确的排序规则,Sequelize 的查询结果可能是不稳定的。本文将深入探讨这一问题,分析其产生的原因,并提供一种解决方案…

    2025年12月20日
    000
  • JavaScript:在具有相同类名的多个表单中访问特定类

    本文旨在解决在包含多个表单的页面中,当不同表单中存在同名类时,如何使用 JavaScript准确访问特定表单内的类元素的问题。通过修改选择器和使用console.log进行调试,可以轻松定位和操作目标元素。本文提供了详细的代码示例和注意事项,帮助开发者避免常见错误,提升开发效率。 当网页中存在多个表…

    2025年12月20日 好文分享
    000
  • 使用 Sequelize 进行关联查询时排序混乱问题排查与解决

    在使用 Sequelize 进行关联查询时,如果发现主表数据的排序出现混乱,很有可能是由于关联表的数据未进行排序导致的。例如,在你的场景中,Recipe 表关联了 Tag 表,如果 Tag 表的数据没有明确的排序规则,那么每次查询时,Tag 表返回的数据顺序可能不同,从而影响最终 Recipe 表的…

    2025年12月20日
    000

发表回复

登录后才能评论
关注微信