Построитель форм
Модуль 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.panels import (
FieldPanel, FieldRowPanel,
InlinePanel, MultiFieldPanel
)
from wagtail.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 отвечает за обслуживание как самой страницы формы, так и страницы назначения после отправки, поэтому определение модели должно включать все необходимые поля контента для обоих этих представлений.
Даты и значения datetime в ответ на форму будут отформатированы с помощью 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.panels 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/v3.0.3/reference/contrib/forms/index.html