我有下一个结构的自定义插件。 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 %}
但它没有做任何事情=(
提前致谢!
答案 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():
无论如何,感谢这个问题,因为它成了我的向导。