如何将 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)
...
我按照此 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)
...