Spec-Zone.ru › Wagtail 3

Как использовать переадресацию с Form Builder для предотвращения повторной отправки формы

Часто ответы HTTP на отправку формы представляют собой временную переадресацию на новую страницу. По умолчанию успешные ответы этого не делают, что означает риск того, что пользователи могут обновить страницу успеха и повторно отправить свою информацию.

Вместо отображения содержимого в ответе 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, route


class FormPage(RoutablePageMixin, AbstractEmailForm):

    # fields, content_panels, …

    @route(r"^$")
    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)

    @route(r"^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/v3.0.3/advanced_topics/formbuilder_routablepage_redirect.html

Spec-Zone.ru

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