0

我有具有下一个结构的自定义插件。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)

管理员.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 %}

但它什么也没做=(

提前致谢!

4

2 回答 2

1

我想你只需要:

product.InstallationStep_set.all

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

您可以在 django shell 中对此进行试验。如果您尝试执行 foo.bar 并且 foo 中没有 bar,模板将静默失败...

于 2012-10-03T09:58:50.673 回答
0

根据文档,您还需要修改模型中的 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()

笔记

不确定关于InstallationStep_setfor 因为我通常在字段中使用related_name参数。ForeignKey例如,

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

你的 for 将是:

for associated_item in oldinstance.installationsteps.all():

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

于 2014-03-09T07:24:20.623 回答