Как добавить постоянные поля в конструктор форм 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
Вернуться на верх