ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

Wagtail 如何用 StreamField 构建按受众分段显示的分段内容块?

Wagtail 如何用 StreamField 构建按受众分段显示的分段内容块? Wagtail 如何用 StreamField 构建按受众分段显示的分段内容块【免费下载链接】wagtailA Django content management system focused on flexibility and user experience项目地址: https://gitcode.com/GitHub_Trending/wa/wagtail如果你的页面需要向不同访客展示不同的内容——例如登录用户看到会员专属区块匿名访客看到通用区块——Wagtail 可以不用第三方包就实现这种简单的内容分段segmentation。做法是自定义一个StructBlock在块中同时保存富文本内容和一个“受众分段”选项渲染时根据当前请求的登录状态决定是否输出该块在编辑后台则通过页面的 preview modes 让编辑人员在发布前分别预览“匿名访客”和“登录用户”两种效果。官方文档把这一整套用法归为内容个性化content personalization的典型场景适用于限时/时段变体、UTM 投放参数或 referrer 分段、登录用户专属内容等更复杂的分析式定向则建议评估外部的 wagtail-personalisation 包。定义 SegmentedContentBlock分段块是一个StructBlock包含两个子块content富文本和segment受众选项默认all。关键在于get_context方法它从父级模板上下文中取出request据此算出is_authenticated供模板判断使用如果请求上带有personalization_preview_segment属性由后文的预览 mixin 写入则优先用它来模拟登录态。class SegmentedContentBlock(StructBlock): content RichTextBlock() segment ChoiceBlock( choices[ (all, All visitors), (logged_in, Logged-in users), (anonymous, Anonymous visitors), ], defaultall, ) def get_context(self, value, parent_contextNone): context super().get_context(value, parent_context) request parent_context.get(request) if parent_context else None preview getattr(request, personalization_preview_segment, None) context[is_authenticated] ( preview logged_in if preview else (request.user.is_authenticated if request else False) ) return context class Meta: icon group template blocks/segmented_content_block.html preview_value { content: pWelcome back! Exclusive content for members./p, segment: logged_in, } description Content targeted to specific audience segments form_layout BlockGroup( children[content], settings[segment], )几个要点Meta.template指定前端渲染使用的模板文件下节给出preview_value是编辑界面中空块时显示的占位内容。form_layout使用了BlockGroupchildren里放始终可见的contentsettings里的segment会默认折叠进编辑界面的“Settings”按钮中把受众配置从正文输入里隔离开。BlockGroup支持嵌套还可传入heading、label_format等参数定制分组外观完整说明见 StructBlock 子块的顺序与分组。这种简单分段可以直接加到任何已有的StructBlock上如果目标块已经比较复杂可按 子块顺序与分组的官方说明 调整字段顺序。编写块的渲染模板模板根据segment的值和is_authenticated条件输出内容并对不同分段套用不同的 CSS 类示例类名来自官方文档可换成你自己的样式{% load wagtailcore_tags %} {% if self.segment all %} div classsegmented-content{{ self.content|richtext }}/div {% elif self.segment logged_in and is_authenticated %} div classsegmented-content segmented-content--logged-in{{ self.content|richtext }}/div {% elif self.segment anonymous and not is_authenticated %} div classsegmented-content segmented-content--anonymous{{ self.content|richtext }}/div {% endif %}匹配条件不满足时不输出任何 HTML也就是该分段的内容对该访客不可见。页面模板中渲染 StreamField 时必须使用{% include_block %}标签而不能直接输出{{ page.body }}只有include_block会把父级上下文包括get_context需要的request对象传给块。这一点在 StreamField 模板渲染 中有专门说明——{% include_block %}的行为类似 Django 的{% include %}默认传递完整的模板上下文。{% load wagtailcore_tags %} {% include_block page.body %}在后台按分段预览为了让编辑人员在发布前核对每个分段的效果在页面模型上定义 preview modes并用一个 mixin 把当前选中的模式写到请求上供块的get_context读取class PersonalizationPreviewMixin: default_preview_mode anonymous preview_modes [ (anonymous, _(Anonymous visitor)), (logged_in, _(Logged-in user)), ] def serve_preview(self, request, mode_name): request.personalization_preview_segment mode_name return super().serve_preview(request, mode_name)使用方式是把这个 mixin 混入你的页面模型。之后在后台预览面板中切换“Anonymous visitor”与“Logged-in user”两种模式页面上的分段块就会分别按匿名态、登录态渲染编辑人员可以先审阅再发布。preview modes 本身的机制可参考 AbstractPage.preview_modes。验证与限制完成后的验证路径编辑一个包含该分段块的页面分别切换到两种预览模式确认logged_in段的内容只在“Logged-in user”模式下出现anonymous段的内容只在“Anonymous visitor”模式下出现all段两种模式都显示。发布后用真实访问状态查看线上页面以登录用户身份访问应看到segmented-content--logged-in标记的区块未登录访问则看到segmented-content--anonymous标记的区块类名以你模板实际写出的为准。限制与边界get_context依赖{% include_block %}传递的父级上下文如果你的模板绕开该标签直接渲染 StreamField块拿不到request分段逻辑会失效。前端模板区分预览与线上输出时可用request.preview_mode判断当前使用的具体预览模式见 模板编写文档本例的分段块则通过personalization_preview_segment属性完成同样的区分。官方文档明确指出对于更高级的分段或基于分析的定向投放应考虑外部包 wagtail-personalisation本文方案覆盖的是基于请求上下文登录态等的简单分段。如果需求是整页级别的访问控制仅登录用户或指定分组可访问Wagtail 另有 private pages 功能不必用分段块逐块处理按路由区分投放变体则属于 routable pages 的范畴。完整示例代码与更细致的场景说明以 Content personalization 为准。【免费下载链接】wagtailA Django content management system focused on flexibility and user experience项目地址: https://gitcode.com/GitHub_Trending/wa/wagtail创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表