New in version 3.2.

How to implement content creation wizards

django CMS offers a framework for creating ‘wizards’ - helpers - for content editors.

They provide a simplified workflow for common tasks.

A django CMS Page wizard already exists, but you can create your own for other content types very easily.

Create a content-creation wizard

Creating a CMS content creation wizard for your own module is fairly easy.

To begin, create a file in the root level of your module called forms.py to create your form(s):

# my_apps/forms.py

from django import forms

class MyAppWizardForm(forms.ModelForm):
    class Meta:
        model = MyApp
        exclude = []

Now create another file in the root level called cms_wizards.py. In this file, import Wizard as follows:

from cms.wizards.wizard_base import Wizard
from cms.wizards.wizard_pool import wizard_pool

Then, simply subclass Wizard, instantiate it, then register it. If you were to do this for MyApp, it might look like this:

# my_apps/cms_wizards.py

from cms.wizards.wizard_base import Wizard
from cms.wizards.wizard_pool import wizard_pool

from .forms import MyAppWizardForm

class MyAppWizard(Wizard):
    pass

my_app_wizard = MyAppWizard(
    title="New MyApp",
    weight=200,
    form=MyAppWizardForm,
    description="Create a new MyApp instance",
)

wizard_pool.register(my_app_wizard)

Note

If your model doesn’t define a get_absolute_url function then your wizard will require a get_success_url method.

class MyAppWizard(Wizard):

    def get_success_url(self, obj, **kwargs):
        """
        This should return the URL of the created object, «obj».
        """
        if 'language' in kwargs:
            with force_language(kwargs['language']):
                url = obj.get_absolute_url()
        else:
            url = obj.get_absolute_url()

        return url

That’s it!

Note

The module name cms_wizards is special, in that any such-named modules in your project’s Python path will automatically be loaded, triggering the registration of any wizards found in them. Wizards may be declared and registered in other modules, but they might not be automatically loaded.

The above example is using a ModelForm, but you can also use forms.Form. In this case, you must provide the model class as another keyword argument when you instantiate the Wizard object.

For example:

# my_apps/forms.py

from django import forms

class MyAppWizardForm(forms.Form):
    name = forms.CharField()


# my_apps/cms_wizards.py

from cms.wizards.wizard_base import Wizard
from cms.wizards.wizard_pool import wizard_pool

from .forms import MyAppWizardForm
from .models import MyApp

class MyAppWizard(Wizard):
    pass

my_app_wizard = MyAppWizard(
    title="New MyApp",
    weight=200,
    form=MyAppWizardForm,
    model=MyApp,
    description="Create a new MyApp instance",
)

wizard_pool.register(my_app_wizard)

You must subclass cms.wizards.wizard_base.Wizard to use it. This is because each wizard’s uniqueness is determined by its class and module name.

See the Reference section on wizards for technical details of the wizards API.