gpt4 book ai didi

python - 在 StreamField 中显示时,如何在模型中渲染页面属性?

转载 作者:行者123 更新时间:2023-12-05 03:29:08 25 4
gpt4 key购买 nike

我有以下 StructBlockPage 模型:

class PostGrid(blocks.StructBlock):
title = blocks.CharBlock()
post_1 = blocks.PageChooserBlock()
post_2 = blocks.PageChooserBlock()

class Meta:
template = 'post-grid.html'

class BlogIndex(Page):
body = StreamField([('POSTS', PostGrid()),])

class Meta:
template = 'base.html'

class PostPage(Page):
hero_title = models.CharField(max_length=255)

我想在 body StreamField 中渲染 post_1post_2 的属性:

base.html:

{% for block in page.body %}
{% include_block block %}
{% endfor %}

post-grid.html:

{{ value.post_1.url }}
{{ value.post_1.hero_title }}

value.post_1.url 可以很好地呈现 URL。但是,value.post_1.hero_title 是空白的。

如何呈现页面属性?

最佳答案

当您使用 PageChooserBlock() 时没有指定更多选项,Wagtail 事先不知道检索页面时的页面类型,因此它返回一个基本的 Page实例,它只包含所有页面类型通用的基本字段,例如title

在这种情况下,这些选择器可能只允许 PostPage 的页面,因此您可以在 PageChooserBlock 定义中指定:

class PostGrid(blocks.StructBlock):
title = blocks.CharBlock()
post_1 = blocks.PageChooserBlock(page_type='myapp.PostPage')
post_2 = blocks.PageChooserBlock(page_type='myapp.PostPage')
# replace 'myapp' with your app name

通过此更改,选择器将只允许选择 PostPage 类型的页面,并且在模板上,value.post_1value.post_2 将作为完整的 PostPage 返回实例,允许您使用 hero_title

或者,如果您因为有多种允许的页面类型而无法进行此更改,您可以使用 .specific 强制它获取完整的页面对象:

{% with value.post_1.specific as post_1 %}
{{ post_1.url }}
{{ post_1.hero_title }}
{% endwith %}

但是,每次调用 specific 都会进行一次额外的数据库查询。

关于python - 在 StreamField 中显示时,如何在模型中渲染页面属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71081090/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com