我正在寻找一种方法来渲染一个变量,该变量将在将呈现cms页面的页面的上下文中可用。
例: 我在上下文中有登录用户,我也有他在网站上做的最后一笔交易。
我希望Wagtail的富文本字段中的文字是这样的,以便营销团队可以调整副本。
你好|| firstname ||谢谢你的惠顾。 ||产品名称||将会 很快发货给你。预计交货日期是 || || expected_delivery_date
为了减少混淆,我用双管替换双括号,以显示模板系统不需要是那些模板的django模板。使用https://docs.python.org/3.4/library/string.html#template-strings进行简单模板就足够了 我想我可以做到这一点:
是否有更明显的方法或开箱即用的方式在富文本字段中进行模板化?
答案 0 :(得分:3)
每个插入的上下文变量都有一个单独的流域块很笨拙。您必须覆盖包含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()。
自定义模板过滤器对我来说最简单,所以我开始使用这种方法并在遇到障碍时切换到自定义渲染功能。
答案 1 :(得分:0)
我找到了一种更简单的方法。我希望我的编辑能够为个人用户创建动态自定义页面。有了这个,我的编辑实际上能够将模板变量放入任何类型的内容块中{{var}},就像Django模板语言一样。对于我的用例,我允许我的编辑在CMS中创建电子邮件内容,然后将其拉出来发送电子邮件:
这是要调用的函数:
def re_render_html_template(email_body, context):
"""
This function takes already rendered HTML anbd re-renders it as a template
this is necessary because variables added via the CMS are not caught by the
first rendering because the first rendering is rendering the containing block,
so instead they are rendered as plaintext in content the first render, e.g., {{ var }}
Example:
input: <p>Hey {{ user_account.first_name }}, welcome!</p>
output: <p>Hey Brett, welcome!</p>
@param email_body: html string
@type email_body: str
@param context: context dictionary
@type context: dict
@return: html string
@rtype: str
"""
from django.template import Context
from django.template import Template
template = Template(email_body)
context = Context(context)
email_body = template.render(context)
return email_body
然后我这样称呼它:
email_body = render_to_string(template, context)
# need to re-render to substitute tags added via CMS
email_body = re_render_html_template(email_body, context)