如何在Django中替换占位符(变量)中的占位符?

时间:2018-02-14 13:16:55

标签: django django-templates

在Django模板中,我想从模型字段中添加文本。该文本字段可以理解为文本模板本身。它可能看起来像:

Dear {{user}},
thank your for...
Regards,
  {{sender}}

此文本字段在普通Django模板中以emailtemplate形式提供。上面的字段(user = Joe,sender = Alice)也可用。

{% extends 'base.html' %}
{% block content %}

{{ emailtemplate }}    

{% endblock %}

输出如下

Dear Joe,
thank your for...
Regards,
  Alice

我不知道如何使用内置方法执行此操作。我唯一的想法是在将其移交给模板引擎之前手动解析emailtemplate,因此在视图中。但我确定,我不是第一个遇到这个问题的人。

1 个答案:

答案 0 :(得分:2)

经过多次返工后,我想出了以下解决方案。仔细检查谁可以修改/修改模板字符串,因为这可能是一个很大的安全漏洞,如果错误的人可以改变。

views.py

class YourView(TemplateView):    
    template_name = 'page.html'

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        context["emailtemplate"] = "Dear {{user}}, {{sender}}"
        context["user"] = "Joe"
        context["sender"] = "Alice"
        return context

page.html

{% extends 'base.html' %}
{% load core_tags %}

{% block content %}

{% foobar emailtemplate %}

{% endblock %}

your_app/templatetags/core_tags.py(不要忘记__init__.py文件以确保将目录视为Python包your_app也必须在INSTALLED_APPS中):

from django.template import Template

register = template.Library()


@register.simple_tag(takes_context=True)
def foobar(context, ts):
    t = Template(template_string=ts)
    return t.render(context)

另见:

https://docs.djangoproject.com/en/2.0/howto/custom-template-tags/#code-layout https://docs.djangoproject.com/en/2.0/howto/custom-template-tags/#simple-tags