Избегайте повторной отправки формы Django с помощью HttpResponseRedirect
Мой views.py выполняет код нормально, когда я нажимаю кнопку на моей HTML странице, views.py:
def start_or_end_fast(request):
#If starting fast, add a row to the db:
#fast_finished = False
#start_date_time using = current time
#end_date_time using = current time
if request.method == 'POST' and 'start_fast' in request.POST:
add_fast = logTimes(fast_finished=False,start_date_time=datetime.now(),end_date_time=datetime.now())
add_fast.save()
print(add_fast.start_date_time,add_fast.end_date_time)
print('Fast started')
#return render(request,'startandstoptimes/index.html')
return HttpResponseRedirect('startandstoptimes/index.html')
Вы можете видеть мою закомментированную строку возврата, это работает, но когда я обновляю страницу, я могу повторно отправить данные, я хочу избежать этого. Исследуя свое решение, я увидел, что это можно решить с помощью HttpResponseRedirect, но я не могу заставить это работать с моим кодом, чем больше я меняю, тем больше все ломается.
Мое приложение urls.py:
from turtle import home
from django.urls import path,include
from . import views
urlpatterns = [
path('', views.start_or_end_fast,name="start_or_end_fast")
]
Мой проект urls.py:
urlpatterns = [
path('admin/', admin.site.urls),
path('', include('startandstoptimes.urls'))
]
Я полагаю, что это связано с URL, из-за сообщения 404, которое я вижу:
Page not found (404)
Request Method: GET
Request URL: http://127.0.0.1:8000/startandstoptimes/index.html
Using the URLconf defined in myfastingsite.urls, Django tried these URL patterns, in this order:
admin/
[name='start_or_end_fast']
The current path, startandstoptimes/index.html, didn’t match any of these.
<
class HttpResponseRedirect¶
.В конструкторе требуется первый аргумент - путь, на который нужно перенаправить. Это может быть полный URL (например. 'https://www.yahoo.com/search/'), абсолютный путь без домена (например, '/search/'), или даже относительный путь (например, 'search/'). В этом последнем случае клиентский браузер сам восстановит полный URL-адрес в соответствии с текущим путем. Другие дополнительные аргументы конструктора см. в разделе HttpResponse. аргументы конструктора. Обратите внимание, что возвращается HTTP код состояния 302.
Для получения более подробной информации смотрите эту ссылку: docs
Как сказано в документации, HttpResponseRedirect принимает URL, а не путь вашего шаблона. Вы должны делать это примерно так:
from django.urls import reverse
return HttpResponseRedirect(reverse('start_or_end_fast'))