Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/vicktornl/wagtail-model-forms
The Wagtail Form Builder functionalities available for your models/snippets.
https://github.com/vicktornl/wagtail-model-forms
Last synced: 10 days ago
JSON representation
The Wagtail Form Builder functionalities available for your models/snippets.
- Host: GitHub
- URL: https://github.com/vicktornl/wagtail-model-forms
- Owner: vicktornl
- License: mit
- Created: 2022-05-12T11:44:49.000Z (over 2 years ago)
- Default Branch: master
- Last Pushed: 2024-07-01T18:22:48.000Z (4 months ago)
- Last Synced: 2024-08-02T07:13:40.933Z (3 months ago)
- Language: Python
- Size: 37.1 KB
- Stars: 4
- Watchers: 2
- Forks: 3
- Open Issues: 2
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
- awesome-wagtail - Wagtail Model Forms - The Wagtail Form Builder functionalities available for your models/snippets. (Apps / Forms)
README
# Wagtail Model Forms
[![Version](https://img.shields.io/pypi/v/wagtail-model-forms.svg?style=flat)](https://pypi.python.org/pypi/wagtail-model-forms/)
![CI](https://github.com/vicktornl/wagtail-model-forms/actions/workflows/ci.yml/badge.svg)The Wagtail Form Builder functionalities available for your models/snippets.
## Features
* Well-known Form Builder functionalities
* Form block for StreamField support
* Extensible models (Form, FormSubmission & FormBlock)
* Reports
* Email notifications
* Webhooks * API integrations
* Crispy forms support## Requirements
- Python >= 3.8
- Django >= 4.2
- Wagtail >= 5.2## Installation
Install the package
```
pip install wagtail-model-forms
```Add `wagtail_model_forms` to your INSTALLED_APPS
```python
INSTALLED_APPS = [
...
"wagtail_model_forms",
]
```Create your models
```python
from django.utils.functional import cached_property
from modelcluster.fields import ParentalKey
from wagtail.core.models import Page
from wagtail.snippets.models import register_snippet
from wagtail_model_forms.mixins import FormSnippetMixin
from wagtail_model_forms.models import AbstractForm, AbstractFormField, AbstractFormSubmissionclass FormField(AbstractFormField):
model = ParentalKey(
"Form",
on_delete=models.CASCADE,
related_name="form_fields",
)class FormSubmission(AbstractFormSubmission):
form = models.ForeignKey(
"Form",
on_delete=models.CASCADE,
related_name="+",
verbose_name=_("Form"),
)@register_snippet
class Form(AbstractForm):
@cached_property
def edit_url(self):
# return your url here, commonly your own modeladmin configuration
url_helper = FormModelAdmin().url_helper
return url_helper.get_action_url("edit", self.id)class MyPage(FormSnippetMixin, Page):
pass
```In order to let the page now that there is a form on it (handle post methods, caching etc.) we need to make sure the method `page_has_form` returns `True`. To make your life easier you can set the property `streamfields` with the names of the StreamField which can have the form added. Also make sure the name of the block is matched, commonly called `form` in your list of blocks. In some cases you might want to override this method and implement your own bespoke logic here.
```python
from wagtail_model_forms.blocks import FormBlockclass MyPage(FormSnippetMixin, Page):
block_type = "form" # has by default already the value form
streamfields = ["content"] # the name of your streamfields
content = StreamField([
# your other blocks
("form", FormBlock()),
])
```More advanced with your bespoke implementation
```python
from django.utils.functional import cached_propertyclass MyPage(FormSnippetMixin, Page):
@cached_property
def page_has_form(self):
# your bespoke import in order to determine a form is on the page
```It's not mandatory to use the `register_snippet` functionality. You can e.g. use `wagtailmodelchooser` for it or any other bespoke implementation in order to put the form on your page.
## Settings
###### WAGTAIL_MODEL_FORMS_ADD_NEVER_CACHE_HEADERS`
Default `True`
###### WAGTAIL_MODEL_FORMS_FORM_MODEL
Must be of the form `app_label.model_name`
###### WAGTAIL_MODEL_FORMS_SUBMISSION_MODEL
Must be of the form `app_label.model_name`
###### WAGTAIL_MODEL_FORMS_REPORTS`
Default `True`
###### WAGTAIL_MODEL_FORMS_CIRSPY_FORMS_FORM_TAG
Default `False`
## Templates
**wagtail_model_forms/form.html**
```html
{% if not request.form_success is self.form.id %}{% csrf_token %}
{{ form.as_ul }}
Submit{% else %}
Form success
{% endif %}
```## FAQ
###### The form is not submitted
Make sure you have added the `FormSnippetMixin` and implemented the `page_has_form` method correctly.
###### Request is not available in get_context of FormBlock
Make sure you render your blocks in your templates with `include_block`, see .