Spec-Zone.ru › Wagtail

Как использовать переадресацию с 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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API