在使用Django时,我面临一个奇怪的问题。我可以在数据库中看到我正在提交的视频的两个条目,因为我提交表单的页面在提交后自动刷新(可以刷新,因为我可以在表中看到更新的结果)。
但是问题在于刷新时它重新提交了表单。而且,如果我手动刷新页面,它也会继续提交新视频。在进行了一些研究之后,我在应用程序的views.py中找到了导致问题的文章。
也有一个类似的问题,但是当我也向页面返回一些args时,我不确定他们如何与我的视图集成。 (参考文章:django form resubmitted upon refresh)
下面是我已经不太了解的代码。
# 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)
答案 0 :(得分:1)
当您呈现对给定成功的POST请求的响应时,这是一个已知问题。通常情况下,这里使用Post/Redirect/Get [wiki]模式:如果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')
some_view
通常是列表视图,或者是用于提交 new 条目的同一视图。
请注意,您可能应该重构上面的代码:您在这里使用了许多负逻辑,这使其相当复杂。
您的代码中还有一些 odd 模式:例如,您在视图本身中处理视频,通常不是是个好主意,因为如果很多时间,请求将超时。通常,人们使用异步任务(例如,使用RabbitMQ)进行耗时的处理,例如,参见this article。
form.is_valid()
通常用于检查是否所有必需的元素都在request.POST
和request.FILES
中(必填字段和文件,这些字段是有效的,等等)。 ModelForm
为程序员提供了额外的便利,可以将请求转换为模型对象。