(form_builder)= # 폼 빌더 `wagtailforms` 모듈을 사용하면 '문의하기' 폼과 같은 단일 페이지 폼을 Wagtail 사이트의 페이지로 설정할 수 있습니다. 이 모듈은 사이트 구현자가 자체 사이트별 템플릿으로 `FormPage` 유형을 만들 수 있도록 일련의 기본 모델을 제공합니다. 이 방식으로 페이지 유형이 설정되면 편집자는 일반 페이지 편집기 내에서 원하는 수의 필드로 폼을 만들 수 있습니다. 폼 제출은 Wagtail 관리자 인터페이스 내의 새 '폼' 섹션을 통해 나중에 검색할 수 있도록 저장됩니다. 또한 편집자가 지정한 주소로 선택적으로 이메일을 보낼 수 있습니다. ```{note} **wagtailforms는 [Django의 폼 지원](inv:django#topics/forms/index)을 대체하지 않습니다.** 페이지 작성자가 코드를 작성할 필요 없이 범용 데이터 수집 폼을 만들 수 있도록 설계되었습니다. 특정 동작을 개별 필드에 할당해야 하거나(예: 사용자 계정 생성) 사용자 지정 HTML 레이아웃이 필요한 폼을 만들려는 경우, 필드가 페이지 작성자가 즉석에서 정의하는 대신 코드에 고정된 표준 Django 폼이 훨씬 더 적합할 것입니다. Django 폼을 Wagtail 페이지에 통합하는 예시는 [wagtail-form-example 프로젝트](https://github.com/gasman/wagtail-form-example/commits/master)를 참조하십시오. 더 큰 유연성을 위해 Wagtail의 [StreamField](streamfield_topic)를 사용하여 폼 빌더 기능을 제공하는 여러 타사 패키지가 있습니다. [Wagtail Flexible Forms](https://docs.coderedcorp.com/wagtail-flexible-forms/index.html) 및 [Wagtail Form Plugins](https://github.com/laas/wagtail-form-plugins)를 참조하십시오. ``` (form_builder_usage)= ## 사용법 `INSTALLED_APPS` 에 `wagtail.contrib.forms` 를 추가합니다. ```python INSTALLED_APPS = [ ... 'wagtail.contrib.forms', ] ``` 앱 중 하나의 `models.py` 내에서 `wagtail.contrib.forms.models.AbstractEmailForm` 을 확장하는 모델을 만듭니다. ```python 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`](inv:django#SHORT_DATE_FORMAT) 및 [`SHORT_DATETIME_FORMAT`](inv:django#SHORT_DATETIME_FORMAT)으로 형식이 지정됩니다. (이메일 콘텐츠를 사용자 지정하는 방법은 [](form_builder_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` 변수가 전달됩니다. 따라서 폼에 대한 매우 기본적인 템플릿은 다음과 같습니다. ```html+django {% load wagtailcore_tags %} {{ page.title }}

{{ page.title }}

{{ page.intro|richtext }}
{% csrf_token %} {{ form.as_p }}
``` `form_page_landing.html` 은 사용자가 폼을 성공적으로 제출한 후 표시되는 표준 Wagtail 템플릿이며, `form_submission` 은 이 템플릿에서 사용할 수 있습니다. 랜딩 페이지 템플릿을 동적으로 재정의하려면 `get_landing_page_template` 메서드를 사용하여 재정의할 수 있습니다(`get_template` 과 동일한 방식으로). (wagtailforms_formsubmissionpanel)= ## 폼 제출 정보 표시 `FormSubmissionsPanel` 을 페이지의 패널 정의에 추가하여 폼 제출 수와 가장 최근 제출 시간을 표시하고 전체 제출 데이터에 액세스할 수 있는 빠른 링크를 표시할 수 있습니다. ```python from wagtail.contrib.forms.panels import FormSubmissionsPanel class FormPage(AbstractEmailForm): # ... content_panels = AbstractEmailForm.content_panels + [ FormSubmissionsPanel(), FieldPanel('intro'), # ... ] ``` ## 색인 ```{toctree} --- maxdepth: 1 titlesonly: --- customization ```