Python Django CMS子插件,用于显示从DB表筛选的数据

Python Django CMS子插件,用于显示从DB表筛选的数据,python,django,django-cms,Python,Django,Django Cms,我有两个插件ProductSelector(父)和SpecificationSelector(子)。我想设置子项,以便将其添加到父项时,所显示的规范是产品(父项)的唯一规范。现在它从表中提取所有规格。这些行让我过滤数据,以得到我想要的 编辑:我在代码中发现了一个已修复的错误。我的插件库名称与模型相同。这允许我在子对象中使用ProductSelector.objects.get(cmsplugin_ptr=instance.parent)来获取父实例。我仍然需要弄清楚如何将过滤后的规范列表传递给“

我有两个插件ProductSelector(父)和SpecificationSelector(子)。我想设置子项,以便将其添加到父项时,所显示的规范是产品(父项)的唯一规范。现在它从表中提取所有规格。这些行让我过滤数据,以得到我想要的

编辑:我在代码中发现了一个已修复的错误。我的插件库名称与模型相同。这允许我在子对象中使用ProductSelector.objects.get(cmsplugin_ptr=instance.parent)来获取父实例。我仍然需要弄清楚如何将过滤后的规范列表传递给“PluginAdmin接口”

    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插件的屏幕截图。目前,它显示了表中的所有规格,但我只希望它是该特定产品的规格


提前感谢您的帮助。

CMSPluginBase
inhertis from
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
然后将您的
规格选择或标签更改为使用此表单,如下所示:

class SpecificationSelectorPlugin(CMSPluginBase):
    form = SpecificationSelectorPluginForm

以上仅在规范插件是产品插件的子插件时有效。

你也可以发布你的models.py吗?@Paulo我编辑了它以显示插件的模型。非常感谢Paulo。这很好用。我确实点击了向上投票,但因为我的声誉低于15,所以不会改变它。但对于阅读本文的人来说,这是一个很好的答案,非常有用。