blob: dfa20437411a46f6805d0afc885d2aca23ba0c75 [file] [log] [blame]
=======================
Recipies For Developers
=======================
Here some recipies for application developers.
Automagic Template Variables
============================
Python allows some magic stack manipulation which can be used to
pass variables to templates automatically. It's not a recommended
way to pass variables to templates but it can be useful for some
small generation scripts etc.
Just subclass the environment and add an `autorender` function like
this:
.. sourcecode:: python
import sys
from jinja import Environment
class AutoEnvironment(Environment):
def autorender(self, template):
tmpl = self.get_template(template)
return tmpl.render(sys._getframe(1).f_locals)
You can use it now like this:
.. sourcecode:: python
def foo():
seq = range(10)
foo = "blub"
return env.autorender('foo.html')
In the template you can now access the local variables `seq` and `foo`.
Using Django Filters with Jinja
===============================
If you use Jinja in django and want to use some of the filters that
are part of the django core you can use this snippet:
.. sourcecode:: python
def convert_django_filter(f):
def filter_factory(*args):
def wrapped(env, ctx, value):
return f(value, *args)
return wrapped
return filter_factory
You can now convert django filters for jinja using `convert_filter`. *Note*:
Django only supports one filter argument. Because of this limitation you
shouldn't pass it more arguments than it accepts. Because django uses some
introspection to find out if a filter accepts an argument weird things can
happen if you call it with an incompatible argument count.
You can now register django filters for a jinja environment:
.. sourcecode:: python
from django.template.defaultfilters import date
env.filters['date'] = convert_django_filter(date)
And use it:
.. sourcecode:: jinja
{{ entry.pub_date|date }}
Also keep in mind that Jinja knows about keywords, thus you cannot have a filter
that is called `pluralize` for example.
Such a conversion function is also part of the djangosupport module which was
introduced in Jinja 1.2. It's explained on the `Framework Integration`_ page.
Using Jinja in Django
=====================
.. admonition:: Note
This section is more or less obsolete as of Jinja 1.2 which provides a
djangosupport module, covered on the `Framework Integration`_ page.
This snippet was contributed by Bryan McLemore. It provides a `render_to_response`
function similar to the one shipped with django just that it uses Jinja for
rendering. It applies the context processors on the context and consumes a
`RequestContext`:
.. sourcecode:: python
from django.template.context import get_standard_processors
from django.http import HttpResponse
from jinja import Environment, FileSystemLoader, ChoiceLoader
from django.conf import settings
loaders = []
for location in settings.TEMPLATE_DIRS:
loaders.append(FileSystemLoader(location))
env = Environment(loader=ChoiceLoader(loaders))
def render_to_response(template, context, request=None):
template = env.get_template(template)
if request:
for processor in get_standard_processors():
context.update(processor(request))
return HttpResponse(template.render(context))
If you want to plug Jinja into the Django i18n system you can use this
environment class:
.. sourcecode:: python
from jinja import Environment
from django.utils.translation import gettext, ngettext
class DjangoTranslator(object):
def __init__(self):
self.gettext = gettext
self.ngettext = ngettext
class DjangoEnvironment(Environment):
def get_translator(self, context):
return DjangoTranslator()
Because Django uses gettext internally we can create just assign the
ngettext and gettext functions directly to the translator class.
.. _Framework Integration: frameworks.txt