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. Regrouping admin models by sleytr 5 years, 3 months ago
  2. Flatpage Suggester Template tag for 404 templates by bradmontgomery 3 years, 3 months ago
  3. TemplateTag to Split a List into Uniform Chunks by cmcavoy 5 years, 2 months ago
  4. Update All Apps to Latest Revision by dedaluz 4 years, 9 months ago
  5. Breadcrumbs for flatpages by jca 5 years, 5 months ago

Comments

jezdez (on October 1, 2008):

Please have a look at the django-dbtemplates project that enables you to save templates in the database in an official way and uses an own template loader.

#

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?)