如何在模板中显示来自django-cms自定义插件的数据

时间:2012-10-03 08:23:45

标签: django templates plugins django-cms

我有下一个结构的自定义插件。 models.py看起来像

    class ProductDescription(models.Model):
        name = models.CharField(max_length=30)
        icon = models.ImageField(upload_to="installation_image", blank=True, null=True)
        description = models.TextField(blank=True, null=True)

        def __unicode__(self):
            return self.name

    class ProductPlugin(CMSPlugin):
            product = models.ForeignKey(ProductDescription)

    class ProductSpecification(models.Model):
        product = models.ForeignKey(ProductDescription)
        specification = models.TextField(blank=True, null=True)

    class InstallationStep(models.Model):
        product = models.ForeignKey(ProductDescription)
        step = models.TextField(blank=True, null=True)
        image = models.ImageField(upload_to="installation_image", blank=True, null=True)

admin.py

    class InstallationStepInline(admin.StackedInline):
        model = InstallationStep
        extra = 0

    class ProductSpecificationInline(admin.StackedInline):
        model = ProductSpecification
        extra = 0

    class DeviceAdmin(admin.ModelAdmin):
        inlines = [ProductSpecificationInline ,
        InstallationStepInline]

    admin.site.register(ProductDescription, DeviceAdmin)

和cms_plugin.py

    class CMSProductPlugin(CMSPluginBase):
        model = ProductPlugin
        name = _("Product Description")
        render_template = "product_description.html"

        def render(self, context, instance, placeholder):
            context.update({
                'product':instance.product,
                'object':instance,
                'placeholder':placeholder
            })

            return context

    plugin_pool.register_plugin(CMSProductPlugin)

因此,每个产品可能没有或有几个规格和安装步骤。 问题是如何在模板中呈现这些规范和步骤? 我知道如何获取ProductDescription类的数据。就像

  <div class="test">{{ product.description }}</div>

但我如何提取其他数据?我想它应该像

    {% for steps in product.InstallationStep.all %}
        <div class="test">{{ steps.step }}</div>
    {% endfor %}

但它没有做任何事情=(

提前致谢!

2 个答案:

答案 0 :(得分:1)

我认为你只需要:

product.InstallationStep_set.all

由于您在InstallationStep模型类中有一个ForeignKey,因此django将_set方法放入引用的类中。

你可以在django shell中试验这个。如果您尝试执行foo.bar并且foo中没有任何栏,则模板将无声地失败...

答案 1 :(得分:0)

根据the doc,您还需要修改模型中的copy_relations方法。如果不是,则在发布草稿时不会复制模型,也不会看到任何内容。我不明白你是如何让它发挥作用的。

在你的情况下会是这样的:

class ProductPlugin(CMSPlugin):
    product = models.ForeignKey(ProductDescription)

    def copy_relations(self, oldinstance):
        for associated_item in oldinstance.InstallationStep_set.all():
            # instance.pk = None; instance.pk.save() is the slightly odd but
            # standard Django way of copying a saved model instance
            associated_item.pk = None
            associated_item.plugin = self
            associated_item.save()

注意

不确定for上的InstallationStep_set因为我通常使用related_name字段中的ForeignKey参数。例如,

class InstallationStep(models.Model):
    product = models.ForeignKey(ProductDescription, related_name='installationsteps')

你的意思是:

for associated_item in oldinstance.installationsteps.all():

无论如何,感谢这个问题,因为它成了我的向导。