폼 빌더¶
wagtailforms 모듈을 사용하면 ‘문의하기’ 폼과 같은 단일 페이지 폼을 Wagtail 사이트의 페이지로 설정할 수 있습니다. 이 모듈은 사이트 구현자가 자체 사이트별 템플릿으로 FormPage 유형을 만들 수 있도록 일련의 기본 모델을 제공합니다. 이 방식으로 페이지 유형이 설정되면 편집자는 일반 페이지 편집기 내에서 원하는 수의 필드로 폼을 만들 수 있습니다. 폼 제출은 Wagtail 관리자 인터페이스 내의 새 ‘폼’ 섹션을 통해 나중에 검색할 수 있도록 저장됩니다. 또한 편집자가 지정한 주소로 선택적으로 이메일을 보낼 수 있습니다.
참고
wagtailforms는 Django의 폼 지원을 대체하지 않습니다. 페이지 작성자가 코드를 작성할 필요 없이 범용 데이터 수집 폼을 만들 수 있도록 설계되었습니다. 특정 동작을 개별 필드에 할당해야 하거나(예: 사용자 계정 생성) 사용자 지정 HTML 레이아웃이 필요한 폼을 만들려는 경우, 필드가 페이지 작성자가 즉석에서 정의하는 대신 코드에 고정된 표준 Django 폼이 훨씬 더 적합할 것입니다. Django 폼을 Wagtail 페이지에 통합하는 예시는 wagtail-form-example 프로젝트를 참조하십시오.
더 큰 유연성을 위해 Wagtail의 StreamField를 사용하여 폼 빌더 기능을 제공하는 여러 타사 패키지가 있습니다. Wagtail Flexible Forms 및 Wagtail Form Plugins를 참조하십시오.
사용법¶
INSTALLED_APPS 에 wagtail.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'),
], "이메일"),
]
AbstractEmailForm 은 to_address, from_address, subject 필드를 정의하고 form_fields 가 정의되어 있다고 예상합니다. 추가 필드는 일반 페이지 콘텐츠로 처리됩니다. FormPage 는 폼 페이지 자체와 제출 후 랜딩 페이지를 모두 제공하는 역할을 하므로 모델 정의에는 두 뷰에 필요한 모든 콘텐츠 필드가 포함되어야 합니다.
폼 응답의 날짜 및 시간 값은 각각 SHORT_DATE_FORMAT 및 SHORT_DATETIME_FORMAT으로 형식이 지정됩니다. (이메일 콘텐츠를 사용자 지정하는 방법은 사용자 지정 render_email 메서드을 참조하십시오.)
폼 페이지 유형이 폼-이메일 기능을 제공하지 않으려면 AbstractEmailForm 대신 AbstractForm에서 상속하고 content_panels 정의에서 to_address, from_address, subject 필드를 생략할 수 있습니다.
이제 form_page.html 및 form_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'),
# ...
]