폼 빌더

wagtailforms 모듈을 사용하면 ‘문의하기’ 폼과 같은 단일 페이지 폼을 Wagtail 사이트의 페이지로 설정할 수 있습니다. 이 모듈은 사이트 구현자가 자체 사이트별 템플릿으로 FormPage 유형을 만들 수 있도록 일련의 기본 모델을 제공합니다. 이 방식으로 페이지 유형이 설정되면 편집자는 일반 페이지 편집기 내에서 원하는 수의 필드로 폼을 만들 수 있습니다. 폼 제출은 Wagtail 관리자 인터페이스 내의 새 ‘폼’ 섹션을 통해 나중에 검색할 수 있도록 저장됩니다. 또한 편집자가 지정한 주소로 선택적으로 이메일을 보낼 수 있습니다.

참고

wagtailforms는 Django의 폼 지원을 대체하지 않습니다. 페이지 작성자가 코드를 작성할 필요 없이 범용 데이터 수집 폼을 만들 수 있도록 설계되었습니다. 특정 동작을 개별 필드에 할당해야 하거나(예: 사용자 계정 생성) 사용자 지정 HTML 레이아웃이 필요한 폼을 만들려는 경우, 필드가 페이지 작성자가 즉석에서 정의하는 대신 코드에 고정된 표준 Django 폼이 훨씬 더 적합할 것입니다. Django 폼을 Wagtail 페이지에 통합하는 예시는 wagtail-form-example 프로젝트를 참조하십시오.

더 큰 유연성을 위해 Wagtail의 StreamField를 사용하여 폼 빌더 기능을 제공하는 여러 타사 패키지가 있습니다. Wagtail Flexible FormsWagtail Form Plugins를 참조하십시오.

사용법

INSTALLED_APPSwagtail.contrib.forms 를 추가합니다.

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="폼 필드"),
        FieldPanel('thank_you_text'),
        MultiFieldPanel([
            FieldRowPanel([
                FieldPanel('from_address', classname="col6"),
                FieldPanel('to_address', classname="col6"),
            ]),
            FieldPanel('subject'),
        ], "이메일"),
    ]

AbstractEmailFormto_address, from_address, subject 필드를 정의하고 form_fields 가 정의되어 있다고 예상합니다. 추가 필드는 일반 페이지 콘텐츠로 처리됩니다. FormPage 는 폼 페이지 자체와 제출 후 랜딩 페이지를 모두 제공하는 역할을 하므로 모델 정의에는 두 뷰에 필요한 모든 콘텐츠 필드가 포함되어야 합니다.

폼 응답의 날짜 및 시간 값은 각각 SHORT_DATE_FORMATSHORT_DATETIME_FORMAT으로 형식이 지정됩니다. (이메일 콘텐츠를 사용자 지정하는 방법은 사용자 지정 render_email 메서드을 참조하십시오.)

폼 페이지 유형이 폼-이메일 기능을 제공하지 않으려면 AbstractEmailForm 대신 AbstractForm에서 상속하고 content_panels 정의에서 to_address, from_address, subject 필드를 생략할 수 있습니다.

이제 form_page.htmlform_page_landing.html 이라는 두 개의 템플릿을 만들어야 합니다(여기서 form_page 는 클래스 이름의 밑줄로 구분된 버전입니다). form_page.html 은 표준 Wagtail 템플릿과 달리 일반적인 page 변수 외에 Django Form 객체를 포함하는 form 변수가 전달됩니다. 따라서 폼에 대한 매우 기본적인 템플릿은 다음과 같습니다.

{% 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'),
        # ...
    ]

색인