【问题标题】:How do I prevent data getting added additional times after the page is refreshed?如何防止页面刷新后数据被额外添加?
【发布时间】:2026-01-25 13:00:01
【问题描述】:

我有以下视图,允许用户为给定产品添加评论。用户提交表单后,它会将数据添加到数据库中,然后转到 /view_reviews.html。但是,当我刷新页面时,它会再次添加相同的评论。即使用户碰巧刷新页面,如何确保仅添加一次评论?

def add_review(request, product_id):
    if request.method == 'POST':
        form = ReviewForm(request.POST)
        if form.is_valid():
            form.save()
            product = get_object_or_404(Product, pk=product_id)
            reviews = Review.objects.filter(product_id=product_id)
            return render(request,'reserve/templates/view_reviews.html',{'form': form, 'product':product, 'reviews':reviews})
    else:
        form = ReviewForm()
    variables = RequestContext(request, {'form': form})
    return render_to_response('reserve/templates/create_review.html', variables)

【问题讨论】:

    标签: django templates view model refresh


    【解决方案1】:

    您应该只修改 POST 中的数据,当请求成功时,您会重定向到页面。这样,如果您重新加载,您只是重新加载页面本身,而不是更改数据的 POST。

    所以你应该return HttpReponseRedirect(...)而不是return render(...)

    这还具有您不必复制代码的优点。在您的示例中的form.save() 之后,您有三行实际上只是您在其他地方已经拥有的视图。

    【讨论】:

    • 太棒了,谢谢!我已经用 return HttpResponseRedirect('/products/1/reviews/') 替换了 form.save() 之后的那些行。如何在路径中加入“product_id”参数而不是硬编码1?
    • 查看reverse()函数。