Построитель форм
Модуль 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'),
InlinePanel('form_fields', label="Form fields"),
FieldPanel('thank_you_text'),
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 соответственно. (см. Метод custom 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'),
# ...
]
Индекс
© 2014-present Torchbox Ltd and individual contributors.
All rights are reserved.
Licensed under the BSD License.
https://docs.wagtail.org/en/stable/reference/contrib/forms/index.html