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

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

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

优化模型关系

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

from django.db import models from django.contrib.auth.models import User  class 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_404 from django.http import JsonResponse from .models import Post from django.contrib.auth.decorators import login_required  @login_required def post_list(request):     posts = Post.objects.all()     return render(request, 'network/index.html', {'posts': posts})  @login_required def 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 path from . import views  urlpatterns = [     path('', views.post_list, name='post_list'),     path('like_unlike/<int:post_id>/', views.like_unlike_post, name='like_unlike_post'), ]

前端 HTML 模板

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

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

京点点

京东AIGC内容生成平台

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

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

{% for post in posts %}     <div>         <h3>{{ post.title }}</h3>         <p>{{ post.content }}</p>         <button class="like-button" data-post-id="{{ post.id }}">             {% if user in post.likes.all %}                 <i class="fa fa-thumbs-down"></i> Unlike             {% else %}                 <i class="fa fa-thumbs-up"></i> Like             {% endif %}         </button>         <span class="like-count">Likes: {{ post.number_of_likes }}</span>     </div> {% 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 = '<i class="fa fa-thumbs-down"></i> Unlike';                 } else {                     this.innerHTML = '<i class="fa fa-thumbs-up"></i> 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,提供更灵活的数据接口。

以上就是使用 Djancss javascript java html js 前端 json node go django 常见问题 red JavaScript django css html count 接口 异步

大家都在看:

css javascript java html js 前端 json node go django 常见问题 red JavaScript django css html count 接口 异步

前端
上一篇
下一篇