Django点击评论编辑按钮报edit_review反向解析参数错误求助
问题修复方案
你遇到的Reverse for 'edit_review' with arguments ('',) not found报错是路由定义、视图传参、模板语法、DOM结构多处错误共同导致的,核心问题是模板反向解析路由时传入的review.id为空,按以下步骤逐一修复即可解决:
- 修正
urls.py中编辑评论的路由规则
现有路由未指定参数类型、末尾缺少斜杠,和项目其他路由规范不一致,容易触发匹配异常。将错误行:
替换为:path('edit_review/<review_id>', views.edit_review, name="edit_review"),path('edit_review/<int:review_id>/', views.edit_review, name="edit_review"),- 修正
- 修正
views.py中edit_review视图的逻辑和传参
现有视图存在三个问题:一是重复查询Product实例(review.product本身就是Product对象,不需要再通过name查库);二是提示信息错误引用了函数本身;三是没有把查询到的review实例传给模板,导致模板取不到review的id。
修复后的完整edit_review视图代码:
@login_required def edit_review(request, review_id): review = get_object_or_404(Review, pk=review_id) product = review.product # 直接取外键关联实例,不需要重复查询 if request.method == 'POST': review_form = ReviewForm(request.POST, instance=review) if review_form.is_valid(): review_form.save() messages.success(request, 'Successfully updated Review!') return redirect(reverse('product_detail', args=[product.id])) else: messages.error(request, 'Failed to update review. Please ensure the form is valid.') else: review_form = ReviewForm(instance=review) # 修复提示信息,不要引用函数本身 messages.info(request, f'You are editing your review for {product.name}') template = 'products/edit_review.html' context = { 'review_form': review_form, 'review': review, # 把review实例传给模板 } return render(request, template, context)- 修正
- 修正
edit_review.html的模板语法错误
现有模板两个问题:一是表单循环引用了不存在的form变量(实际传的表单名是review_form);二是取消按钮跳转的reviews路由不存在。修正后的表单部分代码:
<form method="POST" action="{% url 'edit_review' review.id %}" class="form mb-2" enctype="multipart/form-data"> {% csrf_token %} {% for field in review_form %} <!-- 替换form为review_form --> {% if field.name != 'image' %} {{ field | as_crispy_field }} {% else %} {{ field }} {% endif %} {% endfor %} <div class="text-right"> <!-- 替换不存在的reviews路由为商品详情页路由 --> <a class="btn btn-outline-black rounded-0" href="{% url 'product_detail' review.product.id %}">Cancel</a> <button class="btn btn-black rounded-0" type="submit">Update Review</button> </div> </form>- 修正
- 修正
product_detail.html的语法和结构错误
现有模板三个问题:一是编辑按钮的a标签多写了一个冗余的a属性;二是两个权限判断可以合并简化;三是DOM闭合标签放在了权限判断内部,非评论作者访问时会出现结构错乱,导致循环时上下文异常。修复后的评论循环代码:
{% for review in reviews %} <div class="container"> <div class="card"> <div class="card-body"> <div class="row"> <div class="col-md-2"> <img src="https://image.ibb.co/jw55Ex/def_face.jpg" class="img img-rounded img-fluid" alt="Profile picture"/> <p class="text-secondary text-center">{{ review.created_at|date:"Y-m-d" }}</p> </div> <div class="col-md-10"> <p> <a class="float-left" style="color:blue"><strong>{{ review.created_by }}</strong></a> <span class="float-right"><i class="text-warning fa fa-star">{{ review.rating }}/5</i></span> </p> <div class="clearfix"></div> <p>{{ review.content }}</p> {% if user.is_authenticated and user.id == review.created_by.id %} <p> <!-- 删除多余的a属性 --> <a href="{% url 'edit_review' review.id %}" class="float-right btn btn-primary ml-2 text-white"> <i class="fa fa-edit"></i> Edit</a> <a href="{% url 'delete-review' review.id %}" class="float-right btn text-white btn-danger"> <i class="fa fa-trash"></i> Delete</a> </p> {% endif %} </div> </div> </div> </div> </div> {% endfor %}- 修正
所有修改完成后重启Django服务,强制刷新浏览器页面即可正常使用评论编辑功能。
内容的提问来源于stack exchange,提问作者tobias
相关产品推荐
相关产品推荐

