Как использовать переадресацию с Form builder для предотвращения повторной отправки формы
Часто ответы HTTP на отправку форм являются временными переадресациями на новую страницу. По умолчанию ответы об успехе этого не делают, что означает, что есть риск, что пользователи обновили страницу успеха и повторно отправят свою информацию.
Вместо отображения render_landing_page содержимого в ответе POST мы перенаправим на route экземпляра FormPage по пути дочернего URL. Содержимое по-прежнему будет управляться в админке той же страницы формы. Этот подход использует дополнительный модуль contrib wagtail.contrib.routable_page.
Альтернативный подход заключается в переадресации на совершенно другую страницу, что не требует модуля routable_page. См. Переадресацию на пользовательскую целевую страницу.
Убедитесь, что "wagtail.contrib.routable_page" добавлен в INSTALLED_APPS, см. документацию RoutablePageMixin.
from django.shortcuts import redirect
from wagtail.contrib.forms.models import AbstractEmailForm
from wagtail.contrib.routable_page.models import RoutablePageMixin, path
class FormPage(RoutablePageMixin, AbstractEmailForm):
# fields, content_panels, …
@path("")
def index_route(self, request, *args, **kwargs):
"""Serve the form, and validate it on POST"""
return super(AbstractEmailForm, self).serve(request, *args, **kwargs)
def render_landing_page(self, request, form_submission, *args, **kwargs):
"""Redirect instead to self.thank_you route"""
url = self.reverse_subpage("thank_you")
# If a form_submission instance is available, append the ID to URL.
if form_submission:
url += "?id=%s" % form_submission.id
return redirect(self.url + url, permanent=False)
@path("thank-you/")
def thank_you(self, request):
"""Return the superclass's landing page, after redirect."""
form_submission = None
try:
submission_id = int(request.GET["id"])
except (KeyError, TypeError):
pass
else:
submission_class = self.get_submission_class()
try:
form_submission = submission_class.objects.get(id=submission_id)
except submission_class.DoesNotExist:
pass
return super().render_landing_page(request, form_submission)
© 2014-present Torchbox Ltd and individual contributors.
All rights are reserved.
Licensed under the BSD License.
https://docs.wagtail.org/en/stable/advanced_topics/formbuilder_routablepage_redirect.html