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

Django子模型评论编辑失效 点击编辑无报错仅重定向回页面顶部

Django评论编辑功能跳转异常修复方案

核心问题说明

点击编辑评论按钮无报错、直接跳回同页面顶部,本质是代码业务逻辑错误导致永远无法渲染评论编辑页,所有请求都被强制重定向回商品详情页,没有触发框架级异常所以无错误提示。

分模块修复步骤

1. 修复路由配置(urls.py)

原路由存在两个问题:

  • 评论编辑路径未指定review_id的参数类型为整数,容易被前面的商品详情路由提前拦截
  • 路径末尾缺少斜杠,会触发Django默认的斜杠重定向,同时删除评论的路由也存在同样问题
    替换为以下代码:
from django.urls import path
from . import views

urlpatterns = [
    path('', views.all_products, name='products'),
    path('<int:product_id>/', views.product_detail, name='product_detail'),
    path('add/', views.add_product, name='add_product'),
    path('edit/<int:product_id>/', views.edit_product, name='edit_product'),
    path('delete/<int:product_id>/', views.delete_product, name='delete_product'),
    path('review/delete/<int:review_id>/', views.delete_review, name='delete-review'),
    path('review/edit/<int:review_id>/', views.edit_review, name="edit_review"),
]

2. 修复编辑视图逻辑(views.py)

原视图存在5个致命错误:

  • @login_required装饰器缩进错误,没有正确装饰视图函数
  • 无论GET/POST请求,函数最后一行永远执行重定向到商品详情页,完全没有写渲染编辑模板的代码,这是跳转异常的核心原因
  • 消息提示逻辑完全错位:表单校验失败、成功的提示位置颠倒,GET请求分支错误放了表单错误提示
  • 模板传参错误:将review对象赋值给product键,导致模板找不到review变量;获取关联商品的写法冗余,直接取外键即可
  • 缺少权限校验,任意登录用户可以修改其他人的评论
    替换为以下代码:
from django.shortcuts import render, redirect, reverse, get_object_or_404
from django.contrib import messages
from django.contrib.auth.decorators import login_required
from django.db.models import Q
from django.db.models.functions import Lower

from .models import Product, Category, Review
from .forms import ProductForm, ReviewForm


def product_detail(request, product_id):
    product = get_object_or_404(Product, pk=product_id)
    if request.method == 'POST':
        # 补充登录校验,未登录用户不能发评论
        if not request.user.is_authenticated:
            messages.error(request, '请先登录再提交评论')
            return redirect('account_login')
        rating = request.POST.get('rating', 3)
        content = request.POST.get('content', '').strip()
        if content:
            Review.objects.create(
                product=product,
                rating=rating,
                content=content,
                created_by=request.user
            )
            messages.success(request, '评论提交成功')
        return redirect('product_detail', product_id=product_id)

    reviews = Review.objects.filter(product=product)
    context = {
        'product': product,
        'reviews': reviews
    }
    return render(request, 'products/product_detail.html', context)


# 修复装饰器缩进
@login_required
def edit_review(request, review_id):
    """
    保存用户编辑后的评论
    """
    review = get_object_or_404(Review, pk=review_id)
    # 直接取外键关联的商品,无需额外查询
    product = review.product

    # 越权校验
    if request.user != review.created_by:
        messages.error(request, '你无权编辑这条评论')
        return redirect(reverse('product_detail', args=[product.id]))

    if request.method == 'POST':
        review_form = ReviewForm(request.POST, instance=review)
        if review_form.is_valid():
            review_form.save()
            messages.success(request, '评论修改成功')
            return redirect(reverse('product_detail', args=[product.id]))
        # 表单校验失败提示
        messages.error(request, '表单填写有误,请检查内容后重新提交')
    else:
        # GET请求初始化表单
        review_form = ReviewForm(instance=review)
        messages.info(request, f'你正在编辑ID为{review_id}的评论')

    template = 'products/edit_review.html'
    context = {
        'form': review_form,
        'review': review,
        'product': product,
    }
    # 修复:渲染编辑模板,不要重定向
    return render(request, template, context)

3. 修复编辑模板错误(edit_review.html)

原模板取消按钮指向不存在的reviews路由,会触发404,替换对应按钮代码即可,其余代码保持不变:

<div class="text-right">
    <!-- 修复取消按钮跳转地址,指向当前商品详情页 -->
    <a class="btn btn-outline-black rounded-0" href="{% url 'product_detail' product.id %}">取消</a>
    <button class="btn btn-black rounded-0" type="submit">更新评论</button>
</div>

4. 检查商品详情页的编辑按钮写法

确保商品详情页里的编辑评论按钮href指向正确的路由,不要写href="#"(这种写法点击后默认跳回页面顶部),正确写法参考:

{% if request.user == review.created_by %}
<a href="{% url 'edit_review' review.id %}" class="btn btn-sm btn-outline-secondary">编辑评论</a>
{% endif %}

验证步骤

改完后重启Django服务,清除浏览器缓存,点击编辑按钮即可正常进入评论编辑页,提交后会正确跳转回商品详情页并显示成功提示。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 08:03:28