From cb63c59effc15adf1952276ca2585643835b7435 Mon Sep 17 00:00:00 2001 From: Stephen Burrows Date: Wed, 17 Nov 2010 13:51:13 -0500 Subject: [PATCH] Added {% include_string %} tag to allow passing of context from templates to template code from arbitrary sources (such as a NewsletterArticle). --- templatetags/include_string.py | 38 ++++++++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) create mode 100644 templatetags/include_string.py diff --git a/templatetags/include_string.py b/templatetags/include_string.py new file mode 100644 index 0000000..260dcff --- /dev/null +++ b/templatetags/include_string.py @@ -0,0 +1,38 @@ +from django import template +from django.conf import settings + + +register = template.Library() + + +class IncludeStringNode(template.Node): + """The passed variable is expected to be a string of template code to be rendered with + the current context.""" + def __init__(self, string): + self.string = string + + def render(self, context): + try: + t = template.Template(self.string.resolve(context)) + return t.render(context) + except template.TemplateSyntaxError: + if settings.TEMPLATE_DEBUG: + raise + return settings.TEMPLATE_STRING_IF_INVALID + except: + return settings.TEMPLATE_STRING_IF_INVALID + + +def do_include_string(parser, token): + """ + Include a flat string by interpreting it as a template. + {% include_string %} + """ + bits = token.split_contents() + if len(bits) != 2: + raise TemplateSyntaxError("%r tag takes one argument: the template string to be included" % bits[0]) + string = parser.compile_filter(bits[1]) + return IncludeStringNode(string) + + +register.tag('include_string', do_include_string) \ No newline at end of file -- 2.20.1