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

Django点击评论编辑按钮报edit_review反向解析参数错误求助

问题修复方案

你遇到的Reverse for 'edit_review' with arguments ('',) not found报错是路由定义、视图传参、模板语法、DOM结构多处错误共同导致的,核心问题是模板反向解析路由时传入的review.id为空,按以下步骤逐一修复即可解决:

    1. 修正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"),
    
    1. 修正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)
    
    1. 修正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>
    
    1. 修正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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 10:39:18