Как задать общую форму (ModelForm) для многих плагинов в Django CMS?

Я использую Django 2.2 и Django CMS 3.7.1

У меня есть плагин, определенный следующим образом:

cms_plugins.py

@plugin_pool.register_plugin
class BackgroundImagePlugin(CMSPluginBase):
    """ Background Image """
    name = "Background Image"
    model = models.GenericBackgroundImage
    form = admin.GenericPluginFormWithSettings
    render_template = "plugins/ofc/BackgroundImageFormBoxCta.html"

У меня также есть общая ModelForm("GenericPluginFormWithSettings"), которую я создаю. Я передаю эту форму плагину выше.

Вот этот класс ModelForm:

admin.py

class GenericPluginFormWithSettings(ModelForm):
    class Meta:
        fields = '__all__'

    def __init__(self, *args, **kwargs):
        super(GenericPluginFormWithSettings, self).__init__(*args, **kwargs)
        raw_keys = list(self.fields.keys())
        raw_keys.remove('top_margin')
        raw_keys.remove('bottom_margin')
        raw_keys.append('top_margin')
        raw_keys.append('bottom_margin')
        # raw_keys is in the right order here
        self.Meta.fields = raw_keys

        self.order_fields(raw_keys)

Целью этого класса формы общей модели является постоянное перемещение двух полей (верхнее поле и нижнее поле) в самый низ порядка для любого плагина, на котором они реализованы. Это не позволяет упорядочить поля в нужном мне порядке.

Единственное, что работает, это когда я жестко кодирую порядок полей следующим образом:

class GenericPluginFormWithSettings(ModelForm):
    class Meta:
        fields = ['image', 'header', 'top_margin', 'bottom_margin']

Но очевидно, что я не могу жестко закодировать их, потому что тогда я не смогу использовать этот класс ModelForm со многими различными плагинами, отличными от тех, которые имеют image and header`.

Как я могу реализовать общую форму ModelForm, изменяющую порядок полей, которую я затем могу использовать в плагине?

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