Skip to main content

django-superform

Less sucking formsets.

Build Status Documentation Status Package Version Gitter Chat, discuss django-superform with others

A SuperForm is absolutely super if you want to nest a lot of forms in each other. Use formsets and nested forms inside the SuperForm. The SuperForm will take care of its children!

Imagine you want to have a view that shows and validates a form and a formset. Let’s say you have a signup form where users can enter multiple email addresses. Django provides formsets for this usecase, but handling those in a view is usually quite troublesome. You need to validate both the form and the formset manually and you cannot use django’s generic FormView. So here comes django-superform into play.

Here we have an example for the usecase. Let’s have a look at the forms.py:

from django import forms
from django_superform import SuperModelForm, InlineFormSetField
from myapp.models import Account, Email


class EmailForm(forms.ModelForm):
    class Meta:
        model = Email
        fields = ('account', 'email',)


EmailFormSet = modelformset_factory(EmailForm)


class SignupForm(SuperModelForm):
    username = forms.CharField()
    # The model `Email` has a ForeignKey called `user` to `Account`.
    emails = InlineFormSetField(formset_class=EmailFormSet)

    class Meta:
        model = Account
        fields = ('username',)

So we assign the EmailFormSet as a field directly to the SignupForm. That’s where it belongs! Ok and how do I handle this composite form in the view? Have a look:

def post_form(request):
    if request.method == 'POST':
        form = PostForm(request.POST)
        if form.is_valid():
            account = form.save()
            return HttpResponseRedirect('/success/')
    else:
        form = PostForm()
    return render_to_response('post_form.html', {
        'form',
    }, context_instance=RequestContext(request))

No, we don’t do anything different as we would do without having the FormSet on the SignupForm. That way you are free to implement all the logic in the form it self where it belongs and use generic views like CreateView you would use them with simple forms. Want an example for this?

from django.views.generic import CreateView
from myapp.models import Account
from myapp.forms import SignupForm


class SignupView(CreateView):
    model = Account
    form_class = SignupForm


urlpatterns = patterns('',
    url('^signup/$', SignupView.as_view()),
)

And it just works.

Documentation

Full documentation is available on Read The Docs: https://django-superform.readthedocs.org/


Developed by Gregor Müllegger in cooperation with Team23.

Changelog

0.3.1

  • SuperForm.composite_fields dict is not longer shared between form instances. Every new form instances get’s a deep copy. So changes to it won’t leak into other instances of the same form class.

0.3.0

  • #11: Fix CompositeBoundField to allow direct access to nested form fields via form['nested_form']['field'].

  • Support for Django’s Media handling in nested forms. See #3 and #5.

  • Do not populate errorlist representations without any errors of nested formsets into the errors of the super form. See #5 for details.

0.2.0

  • Django 1.8 support.

  • Initial values given to the __init__ method of the super-form will get passed through to the nested forms.

  • The empty_permitted argument for modelforms used in a ModelFormField is set depending on the required attribute given to the field.

0.1.0

  • Initial release with proof of concept.

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

django-superform-0.3.1.tar.gz (24.2 kB view details)

Uploaded Source

File details

Details for the file django-superform-0.3.1.tar.gz.

File metadata

File hashes

Hashes for django-superform-0.3.1.tar.gz
Algorithm Hash digest
SHA256 149421eaf0cad3571ed8eb159d95a6020dce8bbb93717bc4303fe804c0164aba
MD5 a00c00cd094d665a8342b820823b1abe
BLAKE2b-256 c2a8e21b160b66031439157a73c2f84b94d2981f6e5c85fcbcfb4bd11580c3d8

See more details on using hashes here.

Release history Release notifications | RSS feed

This release

0.3.1 This release

1 file

0.3.0

1 file

0.2.0

1 file

0.1.0

1 file

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page