Wagtail:从 Fieldblock 渲染标签

Wagtail: Rendering tags from Fieldblock

我真的卡在这上面了:(抱歉,新手问题) 按照方法 我需要在页面中呈现标签,但我无法通过 @属性

获取标签值

代码如下,机型:

class TagsBlock(blocks.FieldBlock):
    """
    Basic Stream Block that will use the Wagtail tags system.
    Stores the tags as simple strings only.
    """

    def __init__(self, required=False, help_text=None, **kwargs):
        # note - required=False is important if you are adding this tag to an existing streamfield
        self.field = forms.CharField(widget=AdminTagWidget, required=False)
        super().__init__(**kwargs)
  

class ServicesPage(Page):
    
    services = StreamField([
        ('services',blocks.StructBlock([
            ('entries',PortfolioBlock()),
            ('tags',TagsBlock(required=False)),
    ]))], null=True, blank=True)
    
    @property
    def get_tags(self):
        """
        Helpful property to pull out the tags saved inside the struct value
        Important: makes some hard assumptions about the names & structure
        Does not get the id of the tag, only the strings as a list
        """

        tags_all = [block.value.entries.get('tags', '').split(',') for block in self]

        tags = list(chain.from_iterable(tags_all))

        return tags
    
    content_panels = Page.content_panels + [
        StreamFieldPanel('services'),

    ]

然后在我正在做的模板中:

         <div class="row-4">
            
            {% for tag in page.services.get_tags %}
               {{tag}}
            {% endfor %}

          </div>

但是,我得不到任何结果。我真的什么都试过了,但我不知道如何调用 属性 来给我值列表。

非常感谢您的宝贵时间,

弗朗西斯科

在您的模板中,行

{% for tag in page.services.get_tags %}

将尝试访问页面 'services' 字段中名为 get_tags 的 属性。但是,get_tags 没有在那里定义 - 它被定义为页面对象的 属性 - 所以这一行应该是

{% for tag in page.get_tags %}

其次,在行

tags_all = [block.value.entries.get('tags', '').split(',') for block in self]

您打算遍历 StreamField 中的所有项目,但 for block in self 中的 self 指的是页面对象。这应该是 for block in self.services.

最后,在同一行中,block.value 将为您提供每个块的值,在本例中将是两个项目的字典,entriestags。如果你想访问 entries(PortfolioBlock),你会写 block.value['entries']block.value.get('entries') 而不是 block.value.entries - 但你真的不想那样,你想访问tags 项目 - 所以 block.value.entries.get('tags', '').split(',') 应该是 block.value.get('tags', '').split(',').