A replacement for Django's simple_tag decorator.
Project description
Overview
fancy_tag is a template tag decorator designed to replace Django’s built in simple_tag decorator. It’s backwards compatible with simple_tag and adds new calling options like named arguments.
Features
Keyword arguments - arguments can be explicitly assigned to parameter specific parameters in the template tag function
Variable length arguments - The “*args” and “**kwargs” notation
The trailing “as <varname>” to assign the output of the template tag to a variable in the template’s context.
Installation
Add the fancy_tag package to your Python path
Instead of:
@register.simple_tag def some_tag(arg1, arg2): return '%s %s' % (arg1, arg2)
Use:
@fancy_tag(register) def some_tag(arg1, arg2): return '%s %s' % (arg1, arg2)
Examples
Keyword Arguments
Python Code:
@fancy_tag(register) def say_cheese(name, thing_to_say='cheese'): return 'Hey, %s! Say %s!' % (name, thing_to_say)
Template Code:
{% say_cheese "Jacob" %} -> "Hey, Jacob! Say Cheese!" {% say_cheese "Malcolm" thing_to_say="Vegemite" %} -> "Hey Malcolm! Say Vegemite!"
Variable Length Arguments
Python Code:
@fancy_tag(register) def greet_people(*args): return 'Hello, %s' % ', '.join(args)
Template Code:
{% greet_people "Larry" "Darryl" "Darryl" %}
Produces:
Hello, Larry, Darryl, Darryl
Variable Length Keyword Arguments
Python Code:
@fancy_tag(register) def watch_your_mouth(s, **kwargs): for key, value in kwargs.items(): s = s.replace(key, value) return s
Template Code:
{% watch_your_mouth "You damn dirty ape!" "damn"="doggone" "dirty"="handsome" %}
Produces:
You doggone handsome ape!”
Assigning Output To A Variable
Python Code:
@fancy_tag(register) def now(format_string): df = DateFormat(datetime.now()) return df.format(format_string)
Template Code:
{% now as just_now %} Oh no, it's already {{ just_now }}!
Produces:
Oh no, it’s already February 20th, 2010!
Accessing the Template Context
Python Code:
@fancy_tag(register, takes_context) def say_hello_to_user(context, phrase): return u'%s, %s!' % (phrase, context['user'])
Template Context:
{'user': 'Tobias'} # Provided by a template context processor, for example
Template Code:
{% say_hello_to_user "Hallo" %}
Produces:
Hallo, Tobias!
Testing
With Django in your python path, run tests/run_tests.py
Source
License
fancy_tag is Copyright (c) 2010 Sam Bull, Trapeze. It is free software, and may be redistributed under the terms specified in the LICENSE file.
Credits
fancy_tag is maintained by [Sam Bull](sbull@trapeze.com), and is funded by [Trapeze](http://trapeze.com)