A Django app for building custom web forms and collecting submissions.
Project description
Django Formulaic
Django Formulaic allows Django Admin users to create custom forms. The generated forms are rendered using an extension of Django's Form class. Form submission data is collected by the app and accessible via its admin interface.
The app was originally developed for internal use. We hope others will find it useful, but it definitely lacks polish at this point in its development.
Implementation
Configuration
# settings.py
INSTALLED_APPS = [
# ...
'django_filters',
'rest_framework',
'formulaic',
'admin_ordering',
# ...
]
# urls.py
urlpatterns = [
# ...
path('formulaic/', include('formulaic.urls')),
path('admin/', admin.site.urls),
]
# settings.py
FORMULAIC_EXPORT_STORAGE_LOCATION = '/data/shared/assets/formulaic_exports'
Example Usage
The CustomForm class extends Django's forms.Form class, so you can expect a lot of the same behavior you see in Django's documentation.
# urls.py
from django.contrib import admin
from django.urls import path, include
from formulaic_demo import views as fd_views
urlpatterns = [
path('form-test/', fd_views.test_formulaic_form),
path(
'form-test/completed/',
fd_views.test_formulaic_form_complete,
name='form-complete'
),
path('formulaic/', include('formulaic.urls')),
path('admin/', admin.site.urls),
]
# formulaic_demo/views.py
from django.shortcuts import redirect, render
from formulaic.forms import CustomForm
from formulaic.models import Form
def test_formulaic_form(request):
formulaic_form = Form.objects.get(slug='robot-form')
if request.method == 'POST':
form = CustomForm(
request.POST,
request=request,
# page-specific name for form. will be stored with each submission in the
# `source` field.
instance_id='form-page-a',
form=formulaic_form
)
if form.is_valid():
formulaic_form.create_submission(
form.cleaned_data,
source=form.instance_id,
metadata={
'extra-data-1': 'some data',
'extra-data-2': 'more data',
}
)
return redirect('form-complete')
elif not form.is_valid():
errors = form.errors
# raise Exception('Not valid {}'.format(form.errors))
return render(request, 'formulaic_demo/formulaic-form.html', {
'form': form
})
else:
form = CustomForm(
request=request,
# page-specific name for form. will be stored with each submission in the
# `source` field.
instance_id='form-page-a',
form=formulaic_form
)
return render(request, 'formulaic_demo/formulaic-form.html', {
'form': form
})
def test_formulaic_form_complete(request):
formulaic_form = Form.objects.get(slug='robot-form')
return render(request, 'formulaic_demo/formulaic-form-complete.html', {
'message': formulaic_form.success_message,
})
<!-- templates/formulaic_demo/formulaic-form.html -->
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>Test Formulaic Form</title>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.2.4/jquery.min.js"></script>
</head>
<body>
{{ form }}
</body>
</html>
<!-- templates/formulaic_demoformulaic-form-complete.html -->
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>Test Formulaic Form</title>
</head>
<body>
<p>{{ message }}</p>
</body>
</html>
Dependencies
Python
- Django 3.1 [wip: expanding to a wider range]
- Python 3.8 [wip: expanding to a wider range]
- django-rest-framework 3.11.2 [wip: any breaking changes in 4.x?]
- django-filter 0.9.2
- nameparser 0.3.16
- pyzipcode 2.0.0
- us 0.9.1
- tzlocal 1.2.2
We would like to phase these out or make them optional
- beautifulsoup4 4.4.1
- raven 6.10.0
- django-ckeditor 5.9.0
JavaScript
- jQuery must be included (for now) for the public-facing forms.
- The admin interface was built mostly using EmberJS. You'll find setup instructions in the
README.mdat the root of that project:/formulaic/static/admin/ember-formulaic. This should only be important if you wish to make changes to the admin.
License
Formulaic is licensed under the MIT License. View the LICENSE file in the root directory for more information.
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file formification-1.2.0.tar.gz.
File metadata
- Download URL: formification-1.2.0.tar.gz
- Upload date:
- Size: 38.2 MB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/4.0.2 CPython/3.9.6
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
2a8155cb1b4ac87d9a6e6cb280dfbd8665aba866f6ed3c109091a47eec434e39
|
|
| MD5 |
7b121eed5079fb502e0fb7b801ed5138
|
|
| BLAKE2b-256 |
7129b6b02496f43e193cd54dafad0637a50b06ee9c50f4a29b6806b5636aeaab
|
File details
Details for the file formification-1.2.0-py3-none-any.whl.
File metadata
- Download URL: formification-1.2.0-py3-none-any.whl
- Upload date:
- Size: 58.3 MB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/4.0.2 CPython/3.9.6
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
437886c618eb3fba9e18f8a8cb3357d92b63cc88168060a8b452b571272fc046
|
|
| MD5 |
79704689a8cf1a473a2cc848b3f5d0b2
|
|
| BLAKE2b-256 |
c876d2c13c6d3b89c5eddb446a37cbe2fc22d24a2d78e7d08a7abd86e1d75147
|