Python 如果booleanBlock为True,则以特定方式渲染streamfield块

Python 如果booleanBlock为True,则以特定方式渲染streamfield块,python,django,jinja2,wagtail,wagtail-streamfield,Python,Django,Jinja2,Wagtail,Wagtail Streamfield,你好,我现在是django/wagtail的新手。我正在制作一个关于页面,显示以前和当前的工作/职位。我做了streamfield blocks的位置,因为经验量是有限的。这是我的模型的代码 #Create experience block class ExperienceBlockStruct(StructBlock): position_title = CharBlock(help_text="Enter a previous position title.") descr

你好,我现在是django/wagtail的新手。我正在制作一个关于页面,显示以前和当前的工作/职位。我做了streamfield blocks的位置,因为经验量是有限的。这是我的模型的代码

#Create experience block 
class ExperienceBlockStruct(StructBlock):
    position_title = CharBlock(help_text="Enter a previous position title.")
    description = CharBlock(help_text="Job description")
    current_position = BooleanBlock(required=False, help_text="Check if 
    current position")

class Meta:
    template = 'blocks/experience_block.html'


class ExperienceBlock(StreamBlock):
    experience = ExperienceBlockStruct(icon="form")
这是我使用模型的页面

class About(Page):
    profile_pic = "some image reduced code bc it currently works"
    bio = RichTextField(blank=True)
    resume = "some document reduced code bc it currently works"
    experience = StreamField(ExperienceBlock())
    content_panels = Page.content_panels + [
        ImageChooserPanel('profile_pic'),
        FieldPanel('bio'),
        DocumentChooserPanel('resume'),
        StreamFieldPanel('experience'),
    ]
现在我面临的问题是如何在不同区域渲染当前位置为True的块。 我试过了

templates/about.html
{% for block in page.experience %}
  {% if block.current_position %}
    {% include_block block %}
  {% endif %}
{% endfor %}
但这并不意味着什么。我也试着

<div class="experience">
  {% if value.current_position %}
    {{ value.position_title }}
  {% else %}
    {{ value.position_title }}
  {% endif %}
</div>

我怎样才能实现这样的目标呢

您的第一个模板片段几乎是正确的-您只需检查
block.value.current\u position
而不是
block.current\u position

{% for block in page.experience %}
    {% if block.value.current_position %}
        {% include_block block %}
    {% endif %}
{% endfor %}
这是因为在
page.experience
上循环会给您一系列
BoundBlock
对象,这些对象会告诉您块值旁边的
block\u类型(在您的情况下总是
'experience'
)。有关更详细的说明,请参阅

您可以在experience\u block.html模板中执行相同的操作(使用
{%for block in value%}
而不是
{%for block in page.experience%}
)-尽管请注意
模板定义需要继续
ExperienceBlock
而不是
ExperienceBlockStruct
,因为这是一个可以访问完整列表的循环,而不是一条记录

为了使事情更整洁,我建议在块上定义一个
get_context
方法,以便在Python代码中而不是在模板中进行数据操作

class ExperienceBlock(StreamBlock):
    experience = ExperienceBlockStruct(icon="form")

    def get_context(self, value, parent_context=None):
        context = super(ExperienceBlock, self).get_context(value, parent_context=parent_context)
        context['current_positions'] = [block for block in value if block.value.current_position]
        context['past_positions'] = [block for block in value if not block.value.current_position]
        return context

    class Meta:
        template = 'blocks/experience_block.html'

这将使变量
当前位置
过去位置
在模板上可用。

您的第一个模板片段几乎是正确的-您只需检查
block.value.current\u position
而不是
block.current\u position

{% for block in page.experience %}
    {% if block.value.current_position %}
        {% include_block block %}
    {% endif %}
{% endfor %}
这是因为在
page.experience
上循环会给您一系列
BoundBlock
对象,这些对象会告诉您块值旁边的
block\u类型(在您的情况下总是
'experience'
)。有关更详细的说明,请参阅

您可以在experience\u block.html模板中执行相同的操作(使用
{%for block in value%}
而不是
{%for block in page.experience%}
)-尽管请注意
模板定义需要继续
ExperienceBlock
而不是
ExperienceBlockStruct
,因为这是一个可以访问完整列表的循环,而不是一条记录

为了使事情更整洁,我建议在块上定义一个
get_context
方法,以便在Python代码中而不是在模板中进行数据操作

class ExperienceBlock(StreamBlock):
    experience = ExperienceBlockStruct(icon="form")

    def get_context(self, value, parent_context=None):
        context = super(ExperienceBlock, self).get_context(value, parent_context=parent_context)
        context['current_positions'] = [block for block in value if block.value.current_position]
        context['past_positions'] = [block for block in value if not block.value.current_position]
        return context

    class Meta:
        template = 'blocks/experience_block.html'
这将使变量
当前位置
过去位置
在模板上可用