Джанго: обновленная страница повторно отправляет форму - PullRequest
0 голосов
/ 09 октября 2018

Я столкнулся с одной странной проблемой при использовании Django.Я вижу две записи видео, которые я отправляю в базу данных, поскольку страница, на которой я отправляю форму, обновляется автоматически после отправки (это нормально, так как я могу видеть обновленные результаты в таблице).

Но проблема при обновлении повторной отправки формы.И если я вручную обновляю страницу, она также продолжает отправлять новые видео.После некоторого исследования я нашел статьи, которые приводят к проблеме в views.py в приложении.

Есть и аналогичный вопрос, но, как они это сделали, я не уверен, как интегрировать свое мнение, так как я возвращаю некоторые аргументы на страницу.(Справочная статья: Форма django повторно отправляется после обновления )

Ниже приведен код, который я уже понимаю меньше.

# 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)

1 Ответ

0 голосов
/ 09 октября 2018

Это известная проблема, когда вы визуализируете ответ для данного успешного запроса 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 добавляет дополнительное удобство программисту для преобразования запроса в объект модели.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...