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
相关产品推荐
相关产品推荐

