Дочерние плагины по умолчанию для пользовательских плагинов - PullRequest
0 голосов
/ 27 ноября 2018

У меня есть собственный плагин MultiColumnResponsive, который получает количество столбцов в качестве параметра и принимает плагин ColumnResponsive только в качестве дочернего.Я хочу создать плагины ColumnResponsive, вложенные как дочерние по умолчанию, но я не могу это сделать.

Вот мой текущий код:

cms_plugins.py

class MultiColumnResponsivePlugin(CMSPluginBase):
    name = "Multi Column Responsive"
    module = _("Containers")
    model = MultiColumn
    render_template = "plugin/multi-column-responsive/multi-column-responsive.html"
    allow_children = True
    child_classes = ["ColumnResponsivePlugin"]

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

class ColumnResponsivePlugin(CMSPluginBase):
    name = "Column Responsive"
    module = _("Containers")
    render_template = "plugin/column-responsive/column-responsive.html"
    allow_children = True
    parent_classes = ["MultiColumnResponsivePlugin"]

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

models.py

class MultiColumn(CMSPlugin):
    NUM_OF_COLUMNS = (
        (1, '1'),
        (2, '2'),
    )
    num_of_columns = models.IntegerField(default=1, choices=NUM_OF_COLUMNS)

Это желаемый результат, когда я добавляю плагин MultiColumnResponsive с 2 столбцами:

enter image description here

РЕДАКТИРОВАТЬ: после нескольких дней копаться в нем.Я добился этого, добавив несколько строк в функцию save_model в классе MultiColumnResponsivePlugin:

def save_model(self, request, obj, form, change):
    response = super(MultiColumnResponsivePlugin, self).save_model(
        request, obj, form, change
    )
    for x in range(int(form.cleaned_data['num_of_columns'])):
        add_plugin(obj.placeholder, ColumnResponsivePlugin.__name__, obj.language, target=obj)
    return response

1 Ответ

0 голосов
/ 28 ноября 2018

Вы можете попробовать это:

from django.forms import ModelForm, NumberInput
from cms.api import add_plugin

class MultiColumnResponsiveForm(ModelForm):
    wanted_children = NumberInput()

    class Meta:
        model = MultiColumn
        fields = '__all__'

class MultiColumnResponsivePlugin(CMSPluginBase):
    name = "Multi Column Responsive"
    module = _("Containers")
    model = MultiColumn
    render_template = "plugin/multi-column-responsive/multi-column-responsive.html"
    allow_children = True
    child_classes = ["ColumnResponsivePlugin"]
    form = MultiColumnResponsiveForm

    def save_model(self, request, obj, form, change):
        wanted_children = form.cleaned_data['wanted_children']
        super().save_model(request, obj, form, change)
        self.extend_children(obj, wanted_children)

    def extend_children(self, parent, wanted_children):
        current_children = parent.get_num_children()
        for _ in range(current_children, wanted_children):
            child = add_plugin(parent.placeholder, ColumnResponsivePlugin,
                               parent.language, target=parent)
            child.save()

Некоторые примечания по этому поводу:

Если вам нужно временное значение, такое как wanted_children, используйте форму и не загрязняйте вашу модель!

Этот фрагмент кода взят из djangocms-cascade , который использует аналогичный подход для достижения того же результата.

...