Django,"render" returns POST 请求而不是 POST 请求后的 GET

Django, "render" returns a POST request and not GET after a POST request

我有我的看法

def my_wishlist(request):
    user = request.user
    user_products = WishlistProductPrices.objects.filter(user=user).all()
    
    ### Create filters ###
    filter = get_user_filter_fields_wishlist(user_products)
    filter = filter(request.GET,queryset = user_products)

    if request.method == "POST":
        post_form = MyForm(request.POST)    
        if post_form.is_valid():
            #do stuff
            form = MyForm()
            context = {
            "form":form,
            "filter":filter
            }

            return render(request, "myapp/add_wishlist.html",context=context) #Returns POST, seems like
        else:
            #invalid post_form
            context = {
                "form":post_form,
                "filter":filter
            }
            return render(request, "myapp/add_wishlist.html",context=context)        
    else: #Get request
        form = MyForm()
        context = {
            "form":form,
            "filter":filter
        }
        
    return render(request, "myapp/add_wishlist.html",context=context)

它就像一个魅力,但在用户提交内容并按 F5 后弹出“你想重新发送信息吗”。

我觉得很奇怪,因为我假设页面底部的 render(request,"mypp/add_wishlist.html) 广告会 return GET 请求?

render 只是呈现模板,并将其包装在 HttpResponse 和 returns 中作为对 HTTP 请求的响应,无论该请求是什么。

这意味着如果表单有效,并且您返回响应,那么刷新通常会发出相同的 HTTP 请求。因此,这意味着下订单的人可以通过刷新网页来下第二个订单。

作为 成功 请求的结果(因此在表单有效的情况下),将实施 Post/Redirect/Get architectural pattern [wiki]。在这种情况下,它不会呈现模板,而是 returns 重定向响应(状态代码为 302 的响应),因此要求浏览器向传递的 url 发出 GET 请求。

您可以使用 redirect(…) function [Django-doc] 进行此类重定向。