Streamfield 中的 Wagtail SnippetChooserBlock
Wagtail SnippetChooserBlock in Streamfield
我在使用代码段选择器块将代码段包含到流场中时遇到了一些问题。
生物片段:
@register_snippet
class BioSnippet(models.Model):
name = models.CharField(max_length=200, null=True)
job_title = models.CharField(max_length=200, null=True, blank=True)
bio = RichTextField(blank=True)
image = models.ForeignKey(
'wagtailimages.Image',
null=True,
blank=True,
on_delete=models.SET_NULL,
related_name='+',
verbose_name='Bio Image'
)
contact_email = models.CharField(max_length=50, null=True, blank=True)
contact_phone = models.CharField(max_length=50, null=True, blank=True)
panels = [
FieldPanel('name'),
FieldPanel('job_title'),
FieldPanel('bio'),
ImageChooserPanel('image'),
FieldPanel('contact_email'),
FieldPanel('contact_phone'),
]
def __str__(self):
return self.name
class Meta:
ordering = ['name',]
生物流场定义:
class BioInline(StructBlock):
bio = SnippetChooserBlock(BioSnippet)
class BioBlock(StructBlock):
overall_title = CharBlock(required=False)
bios = ListBlock(BioInline())
一切正常,但是当我访问模板时,我似乎无法访问代码段的值
{% for b in child.value.bios %}
{{ b }}
<hr>
{{ b.name }}
{% endfor %}
{{ b }} 标签输出:
bio
Sales Team
然而 {{ b.name }} 什么都不输出。 {{ b.values.name }} 或我能猜到的任何其他排列也没有。我怀疑这些值只是没有被拉低。
bios
在这里定义为 BioInline
值的列表,因此模板中的 b
将是一个 BioInline
值 - 它有一个 属性, bio
(给你实际的 BioSnippet
对象)。因此,要获取名称,您必须使用:{{ b.bio.name }}
.
我认为 BioInline
对象实际上并没有给您带来任何好处 - 您可以将 BioBlock
定义为:
class BioBlock(StructBlock):
overall_title = CharBlock(required=False)
bios = ListBlock(SnippetChooserBlock(BioSnippet))
这将使 bios
成为 BioSnippet
的列表 - {{ b.name }}
将按预期工作。
或者,您可以使用 self.bios
在 blocks.py 中,您必须导入代码段模型(应该已经准备好):
from thebioapp.models import BioSnippet
然后在模板本身中使用这个模型
{% for b in self.bios %}
{{ b }}
<hr>
{{ b.name }}
{% endfor %}
post 已经很老了,但是随着 Wagtail 越来越受欢迎,我希望这对其他人有所帮助!
我在使用代码段选择器块将代码段包含到流场中时遇到了一些问题。
生物片段:
@register_snippet
class BioSnippet(models.Model):
name = models.CharField(max_length=200, null=True)
job_title = models.CharField(max_length=200, null=True, blank=True)
bio = RichTextField(blank=True)
image = models.ForeignKey(
'wagtailimages.Image',
null=True,
blank=True,
on_delete=models.SET_NULL,
related_name='+',
verbose_name='Bio Image'
)
contact_email = models.CharField(max_length=50, null=True, blank=True)
contact_phone = models.CharField(max_length=50, null=True, blank=True)
panels = [
FieldPanel('name'),
FieldPanel('job_title'),
FieldPanel('bio'),
ImageChooserPanel('image'),
FieldPanel('contact_email'),
FieldPanel('contact_phone'),
]
def __str__(self):
return self.name
class Meta:
ordering = ['name',]
生物流场定义:
class BioInline(StructBlock):
bio = SnippetChooserBlock(BioSnippet)
class BioBlock(StructBlock):
overall_title = CharBlock(required=False)
bios = ListBlock(BioInline())
一切正常,但是当我访问模板时,我似乎无法访问代码段的值
{% for b in child.value.bios %}
{{ b }}
<hr>
{{ b.name }}
{% endfor %}
{{ b }} 标签输出:
bio
Sales Team
然而 {{ b.name }} 什么都不输出。 {{ b.values.name }} 或我能猜到的任何其他排列也没有。我怀疑这些值只是没有被拉低。
bios
在这里定义为 BioInline
值的列表,因此模板中的 b
将是一个 BioInline
值 - 它有一个 属性, bio
(给你实际的 BioSnippet
对象)。因此,要获取名称,您必须使用:{{ b.bio.name }}
.
我认为 BioInline
对象实际上并没有给您带来任何好处 - 您可以将 BioBlock
定义为:
class BioBlock(StructBlock):
overall_title = CharBlock(required=False)
bios = ListBlock(SnippetChooserBlock(BioSnippet))
这将使 bios
成为 BioSnippet
的列表 - {{ b.name }}
将按预期工作。
或者,您可以使用 self.bios
在 blocks.py 中,您必须导入代码段模型(应该已经准备好):
from thebioapp.models import BioSnippet
然后在模板本身中使用这个模型
{% for b in self.bios %}
{{ b }}
<hr>
{{ b.name }}
{% endfor %}
post 已经很老了,但是随着 Wagtail 越来越受欢迎,我希望这对其他人有所帮助!