流场中的Wagtail SnippetChooserBlock

P.S*_*mon 2 python django wagtail wagtail-streamfield wagtail-snippet

我在从代码段获取值时遇到了一些麻烦,我已使用代码段选择器块将其包含到流字段中。

BioSnippet:

@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',]
Run Code Online (Sandbox Code Playgroud)

生物流场定义:

class BioInline(StructBlock):
    bio = SnippetChooserBlock(BioSnippet)

class BioBlock(StructBlock):
    overall_title = CharBlock(required=False)
    bios = ListBlock(BioInline())
Run Code Online (Sandbox Code Playgroud)

所有这些都可以,但是当我进入模板时,似乎无法访问代码段的值

{% for b in child.value.bios %}
    {{ b }}

    <hr>
    {{ b.name }}

{% endfor %}
Run Code Online (Sandbox Code Playgroud)

{{b}}标签输出:

bio
Sales Team
Run Code Online (Sandbox Code Playgroud)

但是{{b.name}}不输出任何内容。{{b.values.name}}或我可以猜到的任何其他排列都没有。我怀疑这些价值没有被拉低。

gas*_*man 5

bios这里定义为BioInline值列表,因此b在模板中将是一个BioInline值-具有单个属性bio(为您提供实际的BioSnippet对象)。因此,要获取名称,您必须使用:{{ b.bio.name }}

我认为BioInline对象实际上并没有为您带来任何好处-您可以将其定义BioBlock为:

class BioBlock(StructBlock):
    overall_title = CharBlock(required=False)
    bios = ListBlock(SnippetChooserBlock(BioSnippet))
Run Code Online (Sandbox Code Playgroud)

这将使s bios的列表BioSnippet- {{ b.name }}将按预期工作。