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
将为您提供每个块的值,在本例中将是两个项目的字典,entries
和 tags
。如果你想访问 entries
(PortfolioBlock),你会写 block.value['entries']
或 block.value.get('entries')
而不是 block.value.entries
- 但你真的不想那样,你想访问tags
项目 - 所以 block.value.entries.get('tags', '').split(',')
应该是 block.value.get('tags', '').split(',')
.
我真的卡在这上面了:(抱歉,新手问题)
按照方法
代码如下,机型:
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
将为您提供每个块的值,在本例中将是两个项目的字典,entries
和 tags
。如果你想访问 entries
(PortfolioBlock),你会写 block.value['entries']
或 block.value.get('entries')
而不是 block.value.entries
- 但你真的不想那样,你想访问tags
项目 - 所以 block.value.entries.get('tags', '').split(',')
应该是 block.value.get('tags', '').split(',')
.