分享

如何在wagtail cms字段中包含上下文变量?

 看见就非常 2020-04-29

我正在寻找一种呈现变量的方法,该变量将在呈现cms页面的页面上下文中可用。

例如:在上下文中,我有一个已登录的用户,也有他在网站上进行的最后一笔交易。

我希望Wagtail的RTF文本字段中的文本像这样,以便营销团队可以调整副本。

您好||名字|| 谢谢你的惠顾。||产品名称|| 很快就会发货给您。预期的交付日期是|| expected_delivery_date ||

为了避免混淆,我用双管道替换了双括号,以表明模板系统不需要是这些模板的django模板。简单的模板就足够了,也许使用https://docs./3.4/library/string.html#template-strings 我想我可以通过以下方法实现:

  1. 一个流字段,该字段将具有富文本字段块和具有可使用的上下文变量的自定义块
  2. 一个自定义渲染函数,该函数将正则表达式并将富文本块中的合并标签替换为上下文值
  3. 创建一个用于简单模板的新过滤器。例如:{{page.body | richtext | simpletemplate}}

在富文本字段中还有其他更明显的方法或开箱即用的方法来做模板吗?


解决方案


对于每个插入的上下文变量,使用单独的流域块可能会很麻烦。您必须覆盖将元素包装在div标签中的默认呈现但是我喜欢它对于编辑者来说更加简单。

我之前做过类似自定义渲染的操作,但是使用了简单的TextField来格式化特价商品代码消息。Wagtail编辑器的内容如下help_text

valid_placeholders = ['offer_code', 'month_price']
template_text = models.TextField(
    _('text'),
    help_text="Valid placeholder values are: {all_valid}. Write as {{{example}}}".format(
        all_valid=", ".join(valid_placeholders),
        example=valid_placeholders[0],
    )
)

呈现为有效占位符的值是:offer_code,month_price。写为{{offer_code}}。

然后在视图中:

template_keys = [i[1] for i in Formatter().parse(template_text)]

…并从那里继续渲染。切记也要使用上述Formatter().parse()功能正确验证该字段

我使用Django的模板格式而不是Python的string.format(),因为它会以静默方式失败,但是如果进行了充分的清理,则可以使用string.format()。

自定义模板过滤器对我来说最简单,所以我会从这种方法开始,如果遇到障碍则切换到自定义渲染功能。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多