Построитель форм
Модуль wagtailforms позволяет настраивать одностраничные формы, такие как форма «Свяжитесь с нами», в качестве страниц сайта Wagtail. Он предоставляет набор базовых моделей, которые реализаторы сайтов могут расширять для создания собственного типа FormPage со своими собственными шаблонами, специфичными для сайта. После того, как тип страницы был настроен таким образом, редакторы могут создавать формы в обычном редакторе страниц, состоящие из любого количества полей. Отправленные формы сохраняются для последующего извлечения через новый раздел «Формы» в интерфейсе администратора Wagtail; кроме того, они могут быть отправлены по электронной почте на адрес, указанный редактором.
Примечание
wagtailforms не является заменой поддержке форм Django. Он разработан как способ для авторов страниц создавать формы для сбора данных общего назначения без необходимости писать код. Если вы планируете создать форму, которая назначает определенное поведение отдельным полям (например, создание учетных записей пользователей) или требует пользовательского макета HTML, вам, скорее всего, будет удобнее использовать стандартную форму Django, где поля фиксированы в коде, а не определяются автором страницы в режиме реального времени. Обратитесь к проекту wagtail-form-example для примера интеграции формы Django в страницу Wagtail.
Использование
Добавьте wagtail.contrib.forms в INSTALLED_APPS:
INSTALLED_APPS = [ ... 'wagtail.contrib.forms', ]
Внутри models.py одного из ваших приложений создайте модель, которая расширяет wagtail.contrib.forms.models.AbstractEmailForm:
from django.db import models
from modelcluster.fields import ParentalKey
from wagtail.admin.edit_handlers import (
FieldPanel, FieldRowPanel,
InlinePanel, MultiFieldPanel
)
from wagtail.core.fields import RichTextField
from wagtail.contrib.forms.models import AbstractEmailForm, AbstractFormField
class FormField(AbstractFormField):
page = ParentalKey('FormPage', on_delete=models.CASCADE, related_name='form_fields')
class FormPage(AbstractEmailForm):
intro = RichTextField(blank=True)
thank_you_text = RichTextField(blank=True)
content_panels = AbstractEmailForm.content_panels + [
FieldPanel('intro', classname="full"),
InlinePanel('form_fields', label="Form fields"),
FieldPanel('thank_you_text', classname="full"),
MultiFieldPanel([
FieldRowPanel([
FieldPanel('from_address', classname="col6"),
FieldPanel('to_address', classname="col6"),
]),
FieldPanel('subject'),
], "Email"),
]
AbstractEmailForm определяет поля to_address, from_address и subject, и ожидает определения form_fields. Любые дополнительные поля обрабатываются как обычное содержимое страницы — обратите внимание, что FormPage отвечает за предоставление как самой страницы формы, так и страницы назначения после отправки, поэтому определение модели должно включать все необходимые поля содержимого для обоих этих представлений.
Значения даты и времени в ответе формы будут отформатированы с помощью SHORT_DATE_FORMAT и SHORT_DATETIME_FORMAT соответственно. (см. Метод настройки render_email, чтобы настроить содержимое электронной почты).
Если вы не хотите, чтобы ваш тип страницы формы предлагал функциональность отправки формы по электронной почте, вы можете унаследовать от AbstractForm вместо AbstractEmailForm, и опустить поля to_address, from_address и subject из определения content_panels.
Теперь вам нужно создать два шаблона с именами form_page.html и form_page_landing.html (где form_page — версия класса с нижним подчеркиванием). form_page.html отличается от стандартного шаблона Wagtail тем, что ему передается переменная form, содержащая объект Django Form, помимо обычной переменной page. Таким образом, очень базовый шаблон для формы будет:
{% load wagtailcore_tags %}
<html>
<head>
<title>{{ page.title }}</title>
</head>
<body>
<h1>{{ page.title }}</h1>
{{ page.intro|richtext }}
<form action="{% pageurl page %}" method="POST">
{% csrf_token %}
{{ form.as_p }}
<input type="submit">
</form>
</body>
</html>
form_page_landing.html — это стандартный шаблон Wagtail, отображаемый после успешной отправки пользователем формы, form_submission будет доступен в этом шаблоне. Если вы хотите динамически переопределить шаблон страницы назначения, вы можете сделать это с помощью метода get_landing_page_template (точно так же, как вы делаете это с get_template).
Отображение информации о подаче формы
FormSubmissionsPanel можно добавить в определения панели страницы для отображения количества поданных форм и времени последней подачи, а также быстрой ссылки для доступа к полным данным о подаче:
from wagtail.contrib.forms.edit_handlers import FormSubmissionsPanel
class FormPage(AbstractEmailForm):
# ...
content_panels = AbstractEmailForm.content_panels + [
FormSubmissionsPanel(),
FieldPanel('intro', classname="full"),
# ...
]
Индекс
© 2014-present Torchbox Ltd and individual contributors.
All rights are reserved.
Licensed under the BSD License.
https://docs.wagtail.org/en/v2.16.3/reference/contrib/forms/index.html