Allow template tags in a Flatpage's content

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
from django import template
from django.utils.safestring import mark_safe

register = template.Library()

class RenderNode(template.Node):

    def __init__(self, content):
        self.content = content
    
    def render(self, context):
        try:
            self.content = template.resolve_variable(self.content, context)
            return template.Template(self.content).render(template.Context(context, autoescape=False))
        except template.TemplateSyntaxError, e:
            return mark_safe("<strong>Template error: There is an error one of this page's template tags: <code>%s</code></small>" % e.message)


@register.tag(name='render')
def render_django(parser, token):
    " Example: {% render flatpage.content %}"
    content = token.split_contents()[-1]
    return RenderNode(content)
render_django.is_safe = True

More like this

  1. Tags & filters for rendering search results by exogen 6 years ago
  2. template tag for highlighting currently active page by adunar 5 years, 5 months ago
  3. FieldsetForm by Ciantic 7 years ago
  4. Paginator TemplateTag by trbs 6 years ago
  5. testdata tag for templates by showell 4 years, 11 months ago

Comments

anentropic (on November 22, 2009):

@jezdez dbtemplates doesn't seem to address what kylefox is doing here, which is to allow use of templatetags in flatpages. Which seems more useful than just storing templates in the db (why bother?)... if you have to go through making view stubs for your templates then you lose the shortcut benefit of flatpages.

nice handy snippet, something like this should be part of flatpages!

#

Tarken (on February 25, 2010):

I had to make one small modification to this so that it would work within a loop:

In render, rather than reassigning to "self.content", I just use a local "content" variable. Otherwise I get some nasty huge TemplateSyntaxError.

Now I can use, for example:

{% for article in articles %}
    {% render article.title %}
{% endfor %}

Otherwise works great; I'm using this extensively in my sites. Thank you!

#

mhulse (on February 3, 2012):

Slightly updated the code (using template.Variable() instead of deprecated resolve_variable()).

I also applied @Tarken's fix (using local "content").

Feedback? Worth re-posting here on DjangoSnippets? Perhaps not, but I thought I would share my code in the hopes that is saves others time in the future.

#

(Forgotten your password?)