Добавлено в версии 3.2.

Как внедрить мастера создания контента

django CMS предлагает основу для создания «мастеров» - помощников - для редакторов контента.

Они обеспечивают упрощенный рабочий процесс для выполнения общих задач.

Мастер создания страниц django CMS Page уже существует, но вы можете легко создать свой собственный для других типов контента.

Создайте мастер создания контента

Создать мастер создания контента CMS для собственного модуля довольно просто.

Для начала создайте файл в корневом уровне вашего модуля под названием forms.py для создания вашей формы (форм):

# my_apps/forms.py

from django import forms

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

Теперь создайте еще один файл на корневом уровне под названием cms_wizards.py. В этом файле импортируйте Wizard следующим образом:

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

Затем просто создайте подкласс Wizard, инстанцируйте его, а затем зарегистрируйте. Если бы вы делали это для MyApp, это могло бы выглядеть следующим образом:

# 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)

Примечание

Если в вашей модели не определена функция get_absolute_url, то мастеру потребуется метод get_success_url.

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

Вот и все!

Примечание

Имя модуля cms_wizards является особенным, поскольку все модули с таким именем, находящиеся в пути Python вашего проекта, будут автоматически загружены, что приведет к регистрации всех мастеров, найденных в них. Мастера могут быть объявлены и зарегистрированы в других модулях, но они могут не загружаться автоматически.

В приведенном выше примере используется ModelForm, но вы также можете использовать forms.Form. В этом случае вы должны предоставить класс модели в качестве другого аргумента ключевого слова при инстанцировании объекта Wizard.

Например:

# 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)

Для его использования вы должны подклассифицировать cms.wizards.wizard_base.Wizard. Это связано с тем, что уникальность каждого мастера определяется именем его класса и модуля.

Технические подробности об API мастеров см. в Reference section on wizards.

Вернуться на верх