Это известная проблема, когда вы визуализируете ответ для данного успешного запроса 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)
<b>return redirect('some_view')</b>
Где some_view
обычно представляет собой просмотр списка или то же представление, чтобы разрешить отправку новой записи.
Обратите внимание, что вам, вероятно, следует рефакторировать приведенный выше код: здесь вы используете много отрицательной логики , что делает его довольно сложным.
В вашем коде также есть несколько нечетных шаблонов: например, вы обрабатываете видео в самом представлении, что, как правило, не хорошая идея, поскольку, если это занимает много времени,запрос истечет.Обычно используют асинхронные задачи (например, с RabbitMQ) для выполнения трудоемкой обработки, см., Например, эту статью .
. form.is_valid()
обычно используется для проверки, есливсе обязательные элементы находятся в request.POST
и request.FILES
(обязательные поля и файлы, являются ли эти поля действительными и т. д.).ModelForm
добавляет дополнительное удобство программисту для преобразования запроса в объект модели.