如何将 Django 应用程序与 Django CMS 中的多种形式集成为插件?

How to integrate a Django app with multiple forms in Django CMS as plugin?

我按照此 tutorial 将我的 Django 应用程序集成到我的 Django CMS 网站中。

我的应用 Sale 有两个模型,OrderModel()CustomerModel(),它们都在 forms.py 中用于将一些字段传递给形式,像这样:

class CustomerForm(forms.ModelForm):

    class Meta:
        model = CustomerModel
        fields = ['firstname', 'surname', 'company', 'email',]

class OrderForm(forms.ModelForm):

    class Meta:
        model = OrderModel
        fields = ['product', 'delivery_date',]

如教程中所述,在 models.py 中,我生成了 SalePluginModel,在 cms_plugins.py 中,我指定了 SalePluginPublisher 插件 class,它是负责为 django CMS 提供呈现我的应用程序所需的信息,例如 models.py:

class SalePluginModel(CMSPlugin):

    title = models.CharField(u'title',
        blank=True,
        help_text=u'Optional. Title of the widget.',
        max_length=64,
    )

等等 cms_plugins.py:

class SalePluginPublisher(CMSPluginBase):
    model = SalePluginModel  # model where plugin data are saved
    module = _("Sale")
    name = _("Sale Plugin")  # name of the plugin in the interface
    render_template = "sale/sale_plugin.html"
    form = '' # How to pass multiple model forms here? 

现在的问题是,只有一种形式 class 可以传递给 CMSPluginBase 作为属性。是否有可能在 SalePluginPublisher 中同时包含两种形式 classes 或一般情况下,如何将我的应用程序与 Django CMS 中的两种模型和形式集成? 非常感谢您的帮助!

澄清一下,您想将两个表单传递给插件吗?如果是这样,您可以执行以下操作:

class SalePluginPublisher(CMSPluginBase):
    model = SalePluginModel  # model where plugin data are saved
    module = _("Sale")
    name = _("Sale Plugin")  # name of the plugin in the interface
    render_template = "sale/sale_plugin.html"

    def render(self, context, instance, placeholder):
        context = super().render(context, instance, placeholder)
        context['customer_form'] = CustomerForm()
        context['order_form'] = OrderForm()
        return context

如果您没有专用的 POST url,您也可以在 render 函数中处理 POST 响应。您只需要访问请求对象,例如self.request.POST.

编辑:

以上适用于Python 3,要与Python 2一起使用,您需要将渲染函数的第一行更改为:

context = super(SalePluginPublisher, self).render(context, instance, placeholder)
...