【问题标题】:How to present data from django-cms custom plugin in template如何在模板中显示来自 django-cms 自定义插件的数据
【发布时间】:2012-09-24 03:32:37
【问题描述】:

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

但它什么也没做=(

提前致谢!

【问题讨论】:

    标签: django templates plugins django-cms


    【解决方案1】:

    我想你只需要:

    product.InstallationStep_set.all
    

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

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

    【讨论】:

    • 谢谢你!你救了我的一天!请注意,我必须使用像 product.installationstep_set.all 这样的小写字母
    【解决方案2】:

    根据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,因为我通常在ForeignKey 字段中使用related_name 参数。例如,

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

    你的 for 将是:

    for associated_item in oldinstance.installationsteps.all():
    

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

    【讨论】:

      猜你喜欢
      • 2012-05-26
      • 2014-07-18
      • 1970-01-01
      • 2013-04-05
      • 2014-06-25
      • 1970-01-01
      • 2017-03-20
      • 2011-10-17
      • 1970-01-01
      相关资源
      最近更新 更多