Login

Template tag: Extend with parameters

Author:
miracle2k
Posted:
October 17, 2007
Language:
Python
Version:
.96
Tags:
template templatetag extends parameters
Score:
4 (after 6 ratings)

Extended extends tag that supports passing parameters, which will be made available in the context of the extended template (and all the way up the hierarchy).

It wraps around the orginal extends tag, to avoid code duplication, and to not miss out on possible future django enhancements. Note: The current implementation will override variables passed from your view, too, so be careful.

Some of the argument parsing code is based on: http://www.djangosnippets.org/snippets/11/

Examples:

{% xextends "some.html" %}
{% xextends "some.html" with title="title1" %}
{% xextends "some.html" with title="title2"|capfirst %}
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
from django import template
from django.template.loader_tags import do_extends
import tokenize
import StringIO

register = template.Library()

class XExtendsNode(template.Node):
    def __init__(self, node, kwargs):
        self.node = node
        self.kwargs = kwargs

    def render(self, context):
        # TODO: add the values to the bottom of the context stack instead?
        context.update(self.kwargs)
        try:
           return self.node.render(context)
        finally:
           context.pop()

def do_xextends(parser, token):
    bits = token.contents.split()
    kwargs = {}
    if 'with' in bits:
        pos = bits.index('with')
        argslist = bits[pos+1:]
        bits = bits[:pos]
        for i in argslist:
            try:
                a, b = i.split('=', 1); a = a.strip(); b = b.strip()
                keys = list(tokenize.generate_tokens(StringIO.StringIO(a).readline))
                if keys[0][0] == tokenize.NAME:
                    kwargs[str(a)] = parser.compile_filter(b)
                else: raise ValueError
            except ValueError:
                raise template.TemplateSyntaxError, "Argument syntax wrong: should be key=value"
        # before we are done, remove the argument part from the token contents,
        # or django's extends tag won't be able to handle it.
        # TODO: find a better solution that preserves the orginal token including whitespace etc.
        token.contents = " ".join(bits)

    # let the orginal do_extends parse the tag, and wrap the ExtendsNode
    return XExtendsNode(do_extends(parser, token), kwargs)

register.tag('xextends', do_xextends)

More like this

  1. CallTag - Just like include, but can pass parameters to it by limodou 8 years, 1 month ago
  2. Support for {% macro %} tags in templates, version 2 by mludvig 7 years, 7 months ago
  3. Markdown and Syntax Highlighting in Django by blinks 8 years ago
  4. Append paramaters to a GET querystring (template tag) by gregb 5 years, 8 months ago
  5. Repeat blocks with new context / simple Jinja-like macro system by miracle2k 7 years, 8 months ago

Comments

Please login first before commenting.