Как добавить постоянные поля в конструктор форм Wagtail
Я создал форму заявления на работу с помощью конструктора форм Wagtail. Теперь мне нужно добавить некоторые поля, которые должны быть постоянными и появляться в форме заявления без необходимости добавления их пользователем-администратором каждый раз при создании новой формы заявления.
Например, у меня есть следующее: Имя Электронная почта Номер телефона [поля формы, созданные администратором]
Как инстанцировать первые 3 поля и заполнить данными таблицу FormField db до создания страницы JobApplicationForm?
Мои данные следующие:
FormField(
question = 'Enter Your Name',
label = 'name',
field_type = 'singleline',
required = True,
),
У меня ощущение, что нужно создать сигнал, но я не знаю как?
Это решение предполагает, что вы хотите предварительно создать поля формы 'placeholder', когда пользователь переходит к созданию новой страницы формы. Пользователь сможет легко редактировать/удалять или корректировать их, но ему не придется вручную создавать эти поля каждый раз, когда он переходит к созданию новой страницы формы.
Вы можете позволить FormFields
быть связанным с любым Page
, или создать модель 'FormFieldTemplate
', она будет связана с вашей моделью Form Page Index, позволяя пользователям создавать / управлять созданными по умолчанию полями.
Отсюда вы можете использовать возможности Wagtail для настройки генерируемых форм путем переопределения base_form_class
.
Затем вы можете настроить первоначально созданные "пустые" записи InlinePanel.
Примечание: Этот подход не добавляет новые поля по умолчанию, а просто добавляет их в форму создания по умолчанию. Как только произойдет первое сохранение, они будут находиться в модели. Последующие редактирования сохранят все правки, сделанные в этих полях.
Пример
from wagtail.admin.forms import WagtailAdminPageForm
# .. other imports
class JobListingsIndexPage(Page):
content_panels = Page.content_panels + [
# any default form fields added to the parent will be automatically included on create (copied) to child pages
InlinePanel('form_fields', label="Default form fields"),
]
subpage_types = [FormPage]
class FormField(AbstractFormField):
# adjust the `ParentalKey` to be generic to all `Page` models, not just the form page one
page = ParentalKey(Page, related_name='form_fields', on_delete=models.CASCADE)
class FormPageForm(WagtailAdminPageForm):
def __init__(self, *args,**kwargs):
super().__init__(*args, **kwargs)
# only adjust the create form - setting default placeholder fields based on parent's form fields
if not self.instance.pk:
# leverage the min_num (empty) formsets to inject initial data into X empty forms
# ensure we honour any existing `min_num` already set by adding them
default_fields = self.parent_page.form_fields.values()
self.formsets['form_fields'].min_num = len(default_fields) + self.formsets['form_fields'].min_nu
for index, form in enumerate(self.formsets['form_fields'].forms):
form.initial = default_fields[index]
class FormPage(AbstractEmailForm):
# ... fields / panels etc
base_form_class = FormPageForm