Package: cmsplugin-form-handler
This package provides a mechanism for handling form-submissions in
django-CMS plugins.Jump toQuickstartbelow to get started, or see the properdocumentation.Background & ApproachBackgroundPlugins are a key component ofdjango CMSfor
creating reusable, configurable content fragments in django CMS projects. Due to
their flexibility and utility, project developers would benefit from emitting
forms and handling form submissions using plugins.Since CMS plugins are fragments of a page, they do not provide a unique, URL for
receiving and handling form submissions. This presents numerous challenges when
attempting to process form submissions.ApproachTo get around these limitations, the approach taken in this package is to direct
form submissions from plugins which sub-classFormPluginBaseto a URL that
is outside of the django CMS URL-space and handled by aProcessFormViewprovided by this package.TheProcessFormViewaccepts form-submissions, processes them, and if valid,
sends the resulting form back to the plugin class for handling and then responds
to the request with a redirect to asuccess_urlprovided by the plugin.On validation errors, the view will redirect the request back to the originating
page and provide the form data via a session variable back to the plugin’s form.The user experience is precisely as expected and the handling of the form is
performed without “thrown HTTPRedirectResponses” or any special middleware.This package encapsulates all extra logic so that the plugin developer need
only to subclassFormPluginBaserather than the usualcms.plugin_base.CMSPluginBase.TheFormorModelFormpresented in the CMS plugin should also include
the “mixin”FormPluginFormMixin.QuickstartTo get started quickly, first install the package:pip install cmsplugin-form-handlerAdd the package tosettings.INSTALLED_APPS:# my_cool_project/settings.py

INSTALLED_APPS = (
    ...
    'cmsplugin_form_handler',
)Add an extra line in your url configuration:urlpatterns = i18n_patterns('',
    url(r'^admin/', include(admin.site.urls)),
    ...
    url(r'^plugin_forms/', include('cmsplugin_form_handler.urls',
                                   namespace='cmsplugin_form_handler')),
    url(r'^', include('cms.urls')),
)Add theFormPluginFormMixinmixin to yourForm:# my_cool_project/forms.py

from django import forms
from cmsplugin_form_handler.forms import FormPluginFormMixin

class MyCoolForm(FormPluginFormMixin, forms.Form):
    # everything else is your normal form.
    my_cool_field = forms.CharField(...)
    ...Or, if you’re using aModelForm:# my_cool_project/forms.py

from django import forms
from cmsplugin_form_handler.forms import FormPluginFormMixin

class MyCoolModelForm(FormPluginFormMixin, forms.ModelForm):
    # everything else is your normal form.
    class Meta:
        model = MyCoolModel
    ...Subclass your cms plugin fromFormPluginBase:# my_cool_project/cms_plugins.py

from cmsplugin_form_handler.cms_plugins import FormPluginBase

class MyCoolPlugin(FormPluginBase):
    # Use your normal CMSPlugin attributes...
    render_template = 'plugins/my_cool_plugin.html'
    # Note that ``cache = False`` will automatically be set

    # These should be overridden in sub-classes
    form_class = MyCoolForm  # Or, see: get_form_class()
    success_url = '/static/success/url/here'  # Or, see: get_success_url()

    def render(self, context, instance, placeholder):
        context = super(MyCoolPlugin, self).render(context, instance, placeholder)

        # Do your normal thing here
        ...

        return context

    def get_form_class(self, request, instance):
        # Use this method to programmatically determine the form_class.
        # This is what this method does by default:
        return self.form_class

    def get_success_url(self, request, instance):
        # Use this method to programmatically determine the success_url.
        # This is what this method does by default:
        return self.success_url

    def form_valid(self, request, instance, form):
        # Optionally do something with the rendered form here
        # This is what this method does by default:
        form.save()Finally, update your plugin’s template:# my_cool_project/templates/plugins/my_cool_plugin.html

{% load cmsplugin_form_tags %}

<h2>Form Plugin</h2>
<form action="{% cmsplugin_form_action %}" method="post">
    {% csrf_token %}
    {{ cmsplugin_form }}
    <input type="submit">
</form>