Django-CMS Child 显示来自数据库的过滤数据的插件 table
Django-CMS Child plugin to show filtered data from DB table
我有两个插件 ProductSelector(parent) 和 SpecificationSelector(child)。我想设置 child,这样当您将它添加到 parent 时,显示的规格是产品 (parent) 的唯一规格。现在它从 table 中提取所有规范。这些行让我过滤数据以获得我想要的。
编辑:我发现了一个我在代码中修复的错误。我的 PluginBase 名称与模型相同。这允许我在 child 中使用 ProductSelector.objects.get(cmsplugin_ptr=instance.parent) 来获取 parent 实例。我仍然需要弄清楚如何将过滤后的规范列表传递给 "PluginAdmin Interface"
product = ProductSelector.objects.get(cmsplugin_ptr=instance.parent)
specification = Specifications.objects.filter(product_name__product_name__iexact = product.product_name)
但是,我还没有想出如何将过滤后的列表发送到插件管理界面。
class ProductSelectorPlugin(CMSPluginBase):
model = ProductSelector
name = "Product Selector"
render_template = "product_selector.html"
allow_children = True
child_classes = ['SpecificationSelectorPlugin']
def render(self, context, instance, placeholder):
context['instance'] = instance
return context
plugin_pool.register_plugin(ProductSelectorPlugin)
class SpecificationSelectorPlugin(CMSPluginBase):
model = SpecificationSelector
render_template = "specification_selector.html"
formfield_overrides = {models.ManyToManyField: {'widget': CheckboxSelectMultiple},}
def render(self, context, instance, placeholder):
product = ProductSelector.objects.get(cmsplugin_ptr=instance.parent)
specification = Specifications.objects.filter(product_name__product_name__iexact = product.product_name)
context['instance'] = instance
return context
plugin_pool.register_plugin(SpecificationSelectorPlugin)
models.py
class ProductSelector(CMSPlugin):
product_name = models.ForeignKey(Product, help_text = "Select the product you want to place")
new_product = models.BooleanField(blank=True)
class SpecificationSelector(CMSPlugin):
specification = models.ManyToManyField(Specifications, blank=True)
def __unicode__(self):
return unicode(self.specification)
这是占位符中 Django-cms 插件的截图。目前它显示 table 中的所有规格,但我只希望它是该特定产品的规格。
提前感谢您的帮助。
CMSPluginBase
继承自 ModelAdmin
这意味着您可以在添加和编辑插件时覆盖呈现的表单。
所以你可以像这样创建一个 ModelForm
子类:
class SpecificationSelectorPluginForm(forms.ModelForm):
def __init__(self, *args, **kwargs):
super(SpecificationSelectorPluginForm, self).__init__(*args, **kwargs)
if self.instance.parent_id:
# Assume that the parent is a product instance
parent_plugin = self.instance.parent
product = parent_plugin.get_plugin_instance()[0]
if product:
# It's possible that product is an orphan plugin.
specifications = Specifications.objects.filter(
product_name__product_name__iexact=product.product_name)
self.fields['specification'].queryset = specifications
然后更改您的 SpecificationSelectorPlugin
以像这样使用此表单:
class SpecificationSelectorPlugin(CMSPluginBase):
form = SpecificationSelectorPluginForm
仅当规范插件是产品插件的 直接 子项时,以上内容才有效。
我有两个插件 ProductSelector(parent) 和 SpecificationSelector(child)。我想设置 child,这样当您将它添加到 parent 时,显示的规格是产品 (parent) 的唯一规格。现在它从 table 中提取所有规范。这些行让我过滤数据以获得我想要的。
编辑:我发现了一个我在代码中修复的错误。我的 PluginBase 名称与模型相同。这允许我在 child 中使用 ProductSelector.objects.get(cmsplugin_ptr=instance.parent) 来获取 parent 实例。我仍然需要弄清楚如何将过滤后的规范列表传递给 "PluginAdmin Interface"
product = ProductSelector.objects.get(cmsplugin_ptr=instance.parent)
specification = Specifications.objects.filter(product_name__product_name__iexact = product.product_name)
但是,我还没有想出如何将过滤后的列表发送到插件管理界面。
class ProductSelectorPlugin(CMSPluginBase):
model = ProductSelector
name = "Product Selector"
render_template = "product_selector.html"
allow_children = True
child_classes = ['SpecificationSelectorPlugin']
def render(self, context, instance, placeholder):
context['instance'] = instance
return context
plugin_pool.register_plugin(ProductSelectorPlugin)
class SpecificationSelectorPlugin(CMSPluginBase):
model = SpecificationSelector
render_template = "specification_selector.html"
formfield_overrides = {models.ManyToManyField: {'widget': CheckboxSelectMultiple},}
def render(self, context, instance, placeholder):
product = ProductSelector.objects.get(cmsplugin_ptr=instance.parent)
specification = Specifications.objects.filter(product_name__product_name__iexact = product.product_name)
context['instance'] = instance
return context
plugin_pool.register_plugin(SpecificationSelectorPlugin)
models.py
class ProductSelector(CMSPlugin):
product_name = models.ForeignKey(Product, help_text = "Select the product you want to place")
new_product = models.BooleanField(blank=True)
class SpecificationSelector(CMSPlugin):
specification = models.ManyToManyField(Specifications, blank=True)
def __unicode__(self):
return unicode(self.specification)
这是占位符中 Django-cms 插件的截图。目前它显示 table 中的所有规格,但我只希望它是该特定产品的规格。
提前感谢您的帮助。
CMSPluginBase
继承自 ModelAdmin
这意味着您可以在添加和编辑插件时覆盖呈现的表单。
所以你可以像这样创建一个 ModelForm
子类:
class SpecificationSelectorPluginForm(forms.ModelForm):
def __init__(self, *args, **kwargs):
super(SpecificationSelectorPluginForm, self).__init__(*args, **kwargs)
if self.instance.parent_id:
# Assume that the parent is a product instance
parent_plugin = self.instance.parent
product = parent_plugin.get_plugin_instance()[0]
if product:
# It's possible that product is an orphan plugin.
specifications = Specifications.objects.filter(
product_name__product_name__iexact=product.product_name)
self.fields['specification'].queryset = specifications
然后更改您的 SpecificationSelectorPlugin
以像这样使用此表单:
class SpecificationSelectorPlugin(CMSPluginBase):
form = SpecificationSelectorPluginForm
仅当规范插件是产品插件的 直接 子项时,以上内容才有效。