Skip to content

trapeze/fancy_tag

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

34 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Fancy Tag

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

  1. Add the fancy_tag package to your Python path

  2. 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 or use tox to run the tests using multiple Python and Django versions.

Source

http://github.com/trapeze/fancy_tag

License

fancy_tag is Copyright (c) 2010-2012 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, with support from Trapeze.