Python Django:刷新页面重新提交表单

Python Django:刷新页面重新提交表单,python,html,django,forms,Python,Html,Django,Forms,我在使用Django时遇到了一个奇怪的问题。当我提交表单的页面在提交后自动刷新时,我可以在数据库中看到我提交的视频的两个条目(可以刷新,因为我可以在表中看到更新的结果) 但问题是在刷新时,它会重新提交表单。如果我手动刷新页面,它也会不断提交新视频。在做了一些研究之后,我发现了一些文章,这些文章导致了应用程序中views.py的问题 还有一个类似的问题,但他们的方式,我不知道如何与我的观点,因为我返回一些参数的页面太。(参考文章:) 下面是我已经不太了解的代码 # Uploading videos

我在使用Django时遇到了一个奇怪的问题。当我提交表单的页面在提交后自动刷新时,我可以在数据库中看到我提交的视频的两个条目(可以刷新,因为我可以在表中看到更新的结果)

但问题是在刷新时,它会重新提交表单。如果我手动刷新页面,它也会不断提交新视频。在做了一些研究之后,我发现了一些文章,这些文章导致了应用程序中views.py的问题

还有一个类似的问题,但他们的方式,我不知道如何与我的观点,因为我返回一些参数的页面太。(参考文章:)

下面是我已经不太了解的代码

# Uploading videos form
    if not request.method == "POST":
        f =  UploadForm()   # Send empty form if not a POST method
        args = {"profile_data": profile_data, "video_data": video_data, "form": f}
        return render(request, "home.html", args)

    f = UploadForm(request.POST, request.FILES) # This line is to upload the actual user's content.
    if not f.is_valid():   # Q: Why do we need to check this? And if we do then is the right place and way to do it?
        args = {"profile_data": profile_data, "video_data": video_data}
        return render(request, "home.html", args)

    process_and_upload_video(request)
    args = {"profile_data": profile_data, "video_data": video_data}
    return render(request, "home.html", args)

当您为给定的成功POST请求提供响应时,这是一个已知问题。通常在这里使用这种模式:如果POST成功,您将重定向到视图,这样浏览器会发出一个新的GET请求,因此在刷新时不会重新提交,如:

    # Uploading videos form
    if not request.method == "POST":
        f =  UploadForm()   # Send empty form if not a POST method
        args = {"profile_data": profile_data, "video_data": video_data, "form": f}
        return render(request, "home.html", args)

    f = UploadForm(request.POST, request.FILES) # This line is to upload the actual user's content.
    if not f.is_valid():   # Q: Why do we need to check this? And if we do then is the right place and way to do it?
        args = {"profile_data": profile_data, "video_data": video_data}
        return render(request, "home.html", args)

    process_and_upload_video(request)
    return redirect('some_view')
#上传视频表单
如果不是request.method==“POST”:
f=UploadForm()#如果不是POST方法,则发送空表单
args={“profile_data”:profile_data,“video_data”:video_data,“form”:f}
返回呈现(请求“home.html”,args)
f=上传表单(request.POST,request.FILES)#此行用于上传实际用户的内容。
如果不是f,那么f有效吗():#问:为什么我们需要检查这个?如果我们这样做了,那么这是正确的地方和方式吗?
args={“profile_data”:profile_data,“video_data”:video_data}
返回呈现(请求“home.html”,args)
处理和上传视频(请求)
返回重定向(“某些视图”)
其中,
some_view
通常是一个列表视图,或用于提交新条目的相同视图

请注意,您可能应该重构上面的代码:这里使用了大量负面逻辑,这使得它相当复杂

代码中还有一些奇怪的模式:例如,在视图中处理视频本身,这通常不是一个好主意,因为如果这需要很多时间,请求将超时。通常使用异步任务(例如RabbitMQ)进行耗时的处理,请参见示例


表单.is_valid()
通常用于检查
请求.POST
请求.FILES
(必填字段和文件,这些字段是否有效,等等)。
ModelForm
为程序员提供了一些额外的便利,可以将请求转换为模型对象。

这就是为什么对于有效表单,您应该使用重定向,而不是呈现响应。我只是检查表单是否无效。那么你的意思是我也应该检查“else”条件吗?我在哪里可以做重定向?