'Addons for Django Formtools'
Project description
‘Addons for Django Formtools’
Features
Add multiple forms to a single WizardView step (MultipleFormWizardView and subclasses)
Use form wizard via JSON web API (WizardAPIView)
Quickstart
Install formtools-addons:
pip install django-formtools-addons
Then use it in a project:
# Every *MultipleForm* WizardView that can be imported is an equivalent of a builtin *WizardView in Django Formtools from formtools_addons import (SessionMultipleFormWizardView, CookieMultipleFormWizardView, NamedUrlSessionMultipleFormWizardView, NamedUrlCookieMultipleFormWizardView, MultipleFormWizardView, NamedUrlMultipleFormWizardView) # The WizardAPIView is also based on the builtin WizardView, but does not have the classic request-response cycle, # since it exposes a JSON API from formtools_addons import WizardAPIView
WizardAPIView: Example use
from __future__ import unicode_literals
from formtools_addons import WizardAPIView
from .forms import Form1, Form2, Form3, Form4
def show_substep_4(wizard):
cleaned_data = wizard.get_cleaned_data_for_step('my-page1|my-substep-1') or {}
return cleaned_data.get('some_field', None) != 'some_value'
class TestWizardAPIView(WizardAPIView):
form_list = [
("my-page1", (
("my-substep-1", Form1),
("my-substep-2", Form2),
("my-substep-3", Form3)
)),
("my-page2", (
('my-substep-4', Form4),
))
]
condition_dict = {
'my-page2|my-substep-4': show_substep_4,
}
form_templates = {
"my-page1|my-substep-1": 'demo/page1_substep1.html',
"my-page2|my-substep-4": 'demo/page2_substep4.html',
}
preview_templates = {
"my-page1|my-substep-1": 'demo/page1_substep1_preview.html',
"my-page2|my-substep-4": 'demo/page2_substep4_preview.html',
}
def render_form(self, step, form):
# Get preview template url
template_url = self.form_templates.get(step, None)
if template_url is None:
data = form.cleaned_data
return '<p>NO TEMPLATE: STEP: %s, DATA: %s</p>' % (
step, json.dumps(data, default=self.json_encoder.default))
# Load template
template = get_template(template_url)
# Create context
context = Context()
context['form'] = form
return template.render(context)
def render_preview(self, step, form):
if not form.is_bound or not form.is_valid():
return
# Get preview template url
template_url = self.preview_templates.get(step, None)
if template_url is None:
data = form.cleaned_data
return '<p>NO TEMPLATE: STEP: %s, DATA: %s</p>' % (
step, json.dumps(data, default=self.json_encoder.default))
# Load template
template = get_template(template_url)
# Create context
context = Context()
context['data'] = form.cleaned_data if (form.is_bound and form.is_valid()) else {}
return template.render(context)
################################################################
# testwizard/urls.py
from __future__ import unicode_literals
from django.conf.urls import url
from django.views.decorators.csrf import ensure_csrf_cookie
from .views import TestWizardAPIView
test_wizard = TestWizardAPIView.as_view(url_name='wizard')
urlpatterns = [
# Registration Wizard API URL's
url(r'^(?P<step>.+)/(?P<substep>.+)/$', ensure_csrf_cookie(test_wizard), name='wizard_step'),
url(r'^(?P<step>.+)/$', ensure_csrf_cookie(test_wizard), name='wizard_step'),
]
MultipleFormWizardView: Example use
from __future__ import unicode_literals
from django import forms
from django.shortcuts import render_to_response
from formtools_addons import SessionMultipleFormWizardView
from .forms import Form1, Form2, Form3
class Wizard(SessionMultipleFormWizardView):
form_list = [
("start", Form1),
("user_info", (
('account', Form2),
('address', Form3)
))
]
templates = {
"start": 'demo/wizard-start.html',
"user_info": 'demo/wizard-user_info.html'
}
def get_template_names(self):
return [self.templates[self.steps.current]]
def done(self, form_dict, **kwargs):
result = {}
for key in form_dict:
form_collection = form_dict[key]
if isinstance(form_collection, forms.Form):
result[key] = form_collection.cleaned_data
elif isinstance(form_collection, dict):
result[key] = {}
for subkey in form_collection:
result[key][subkey] = form_collection[subkey].cleaned_data
return render_to_response('demo/wizard-end.html', {
'form_data': result,
})
############################################################################################
form = Wizard.as_view(form_list, instance_dict={
'start': user, # User model instance
'user_info': {
'account': Account.objects.get(user=user),
'address': Address.objects.get(user=user),
},
})
Running Tests
$ tox
History
0.1.0 (2016-02-01)
First release on PyPI.
Project details
Release history Release notifications | RSS feed
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
Close
Hashes for django-formtools-addons-0.1.18.tar.gz
Algorithm | Hash digest | |
---|---|---|
SHA256 | c868fbe5a968f4b5155c1ff6e8cdb756064ef58ed67db1a12b152ef3eec7a0cf |
|
MD5 | f20b8511a4a395bf6b25dca8a853b657 |
|
BLAKE2b-256 | 746363746c9fa6edbbb00015bae637cc07a3886a5dcfd8b5d9524c826aa46462 |
Close
Hashes for django_formtools_addons-0.1.18-py2.py3-none-any.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | d5d7eed1d6da89d2eed07655fcbac215598f834827073ba048580b74a647fd1c |
|
MD5 | 35fd518446d16f7f4fa436830100bb5f |
|
BLAKE2b-256 | ce83178dc99d83db68ade8d90ce372248d496acbc61fde24f8ae0ba8d6373985 |