You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Django中实现无需刷新页面的评论功能

实现Django无刷新评论功能的解决方案

要实现无刷新评论,核心是用AJAX异步提交表单,后端返回JSON数据,前端动态渲染新评论,而非通过重定向刷新页面。以下是针对你现有代码的修改步骤:

一、修改后端视图(views.py)

把原来的重定向返回改成JSON响应,返回新评论的信息和最新评论数:

from django.http import JsonResponse

def addComment(request):
    if request.method == 'POST':
        post_id = request.POST['contentId']
        title = request.POST['title']
        description = request.POST['description']
        user = request.session['user']['id']
        user_name = request.session['user']['name']
        
        con = Comment(
            post_id=post_id,
            title=title,
            description=description,
            visitor_id=user,
        )
        con.save()
        
        # 返回新评论数据和最新计数
        return JsonResponse({
            'success': True,
            'comment': {
                'title': title,
                'name': user_name,
                'description': description
            },
            'new_count': Comment.objects.filter(post_id=post_id).count()
        })
    return JsonResponse({'success': False})

二、调整前端HTML结构

给评论列表添加一个容器,方便后续插入新评论:

<div class="col-4">
  <h4 class="m-3">{{comments.count}} Comments...</h4>
  <!-- 新增card-container容器 -->
  <div class="card-container">
    {% for j in comments %}
    <div class="card" style="width: 18rem;">
      <div class="card-body">
        <h5 class="card-title">{{j.title}}</h5>
        <h6 class="card-subtitle mb-2 text-muted">{{j.visitor.name}}</h6>
        <p class="card-text">{{j.description}}</p>
      </div>
    </div>
    {% endfor %}
  </div>
  <hr>
  <h3>Comment here</h3>
  <form method="post" id="comment-form">
    {% csrf_token %}
    <input type="hidden" id="contentId" name='contentId' value="{{ result.id }}">
    <div class="form-group">
      <input type="hidden" id="name" name="name" class="form-control" value="{{request.session.user.name}}" readonly>
    </div>
    <div class="form-group">
      <label for="title">Title</label>
      <input type="text" id="title" name="title" class="form-control">
    </div>
    <div class="form-group">
      <label for="description">Description</label>
      <textarea name="description" id="description" cols="30" rows="5" class="form-control"></textarea>
    </div>
    <button type="submit" class="btn btn-secondary">Submit</button>
  </form>
</div>

三、添加前端AJAX处理脚本

在页面底部(或</body>标签前)添加JavaScript,监听表单提交事件,异步发送请求并渲染新评论:

<script>
const commentForm = document.getElementById('comment-form');
const commentContainer = document.querySelector('.card-container');
const commentCountEl = document.querySelector('h4.m-3');

commentForm.addEventListener('submit', function(e) {
    e.preventDefault(); // 阻止默认表单提交,避免页面刷新
    
    const formData = new FormData(this);
    
    // 注意替换成你urls.py中addComment对应的URL名称
    fetch('{% url "addComment" %}', {
        method: 'POST',
        body: formData,
        headers: {
            'X-CSRFToken': document.querySelector('[name=csrfmiddlewaretoken]').value
        }
    })
    .then(res => res.json())
    .then(data => {
        if (data.success) {
            // 清空表单
            commentForm.reset();
            
            // 更新评论计数
            commentCountEl.textContent = `${data.new_count} Comments...`;
            
            // 构建新评论卡片HTML
            const newCard = `
                <div class="card" style="width: 18rem;">
                    <div class="card-body">
                        <h5 class="card-title">${data.comment.title}</h5>
                        <h6 class="card-subtitle mb-2 text-muted">${data.comment.name}</h6>
                        <p class="card-text">${data.comment.description}</p>
                    </div>
                </div>
            `;
            
            // 将新评论插入到列表顶部(也可用appendChild放到底部)
            commentContainer.insertAdjacentHTML('afterbegin', newCard);
        } else {
            alert('评论提交失败,请重试');
        }
    })
    .catch(err => {
        console.error('提交出错:', err);
        alert('提交过程中出现错误');
    });
});
</script>

四、补充URL配置

确保你的urls.py中给addComment视图配置了正确的URL名称:

from django.urls import path
from . import views

urlpatterns = [
    # 其他URL...
    path('add-comment/', views.addComment, name='addComment'),
]

内容的提问来源于stack exchange,提问作者Karamjeet Singh

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.25 18:58:33