Spec-Zone.ru › Wagtail 2

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

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

Вместо отображения render_landing_page содержимого в ответе POST мы перенаправим на route экземпляра FormPage по пути дочернего URL. Содержимое по-прежнему будет управляться в админке той же страницы формы. Этот подход использует дополнительный модуль contrib wagtail.contrib.routable_page.

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

Убедитесь, что "wagtail.contrib.routable_page" добавлен в INSTALLED_APPS, см. документацию по установке.

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)
  • Предыдущая Мультисайтовый, многоэкземплярный и многоарендный
  • Следующая Расширение Wagtail

© 2014-present Torchbox Ltd and individual contributors.
All rights are reserved.
Licensed under the BSD License.
https://docs.wagtail.org/en/v2.16.3/advanced_topics/formbuilder_routablepage_redirect.html

Spec-Zone.ru

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