Package: djinga
© 2014-2017 Thomas KhynUnobtrusive jinja2 integration in DjangoTested with Django 1.8, 1.11 and 2.0 and the latest minor versions of Python 2
and 3 (Django 2.0 only supports Python 3).If you likedjingaand are looking for a way to thank me and/or encourage
future development, here is my BTC or BCH donation address:1EwENyR8RV6tMc1hsLTkPURtn5wJgaBfG9.Why djinga ?Simply because no other jinja2 integration app for django met the requirements
of a perfectionist django developer.Djinga enables you to:Use django and jinja2 templates in the same project with dynamic selection
of the template engine to useExtend and include jinja2 templates from django ones and vice-versaInsert django template code into jinja2 templatesTurn any django templatetag or python function into jinja2 filters or
globals using decorators … and without creating import loopsExtract translation strings from jinja2 templates with django’smakemessagesmanagement commandAccess useful jinja2 extensions, such as HTML compression, most django
template’s native tags and context processorsUsageInstall djinga using the method of your choiceAdd ‘djinga’ to your INSTALLED_APPSSet theTEMPLATEsetting as:TEMPLATES = [
   {
      'BACKEND': 'djinga.backends.djinga.DjingaTemplates',
      'DIRS': ['your/first/template/directory',
               'your/second/template/directory'],
      'OPTIONS': {
          ...
      },
   },
]Add the relevantoptionsfor jinja2 and djingaHow it worksBy default, a template will be rendered using Django’s built-in template engine
if it has a .html, .htm, .djhtml or .djhtm file extension. If it has a .jjhtml
or .jjhtm file extension, it will be rendered by Jinja2, using the setting
values provided in django’s setting module.OptionsSimply add the following options to the'OPTIONS'section of theTEMPLATESitem matching the djinga backend:TEMPLATES = [
   {
      'BACKEND': 'djinga.backends.djinga.DjingaTemplates',
      'OPTIONS': {
         'option1': 'value1',
         'option2': {'key1': 'val1',
                     'key2': 'val2'},
          ...
       },
   },
]dj_extsA list or tuple of file extensions (with or without the leading dot) for
templates that should be rendered with Django’s internal template engine.Defaults to('html', 'htm', 'jjhtml', 'jjhtm')jj_extsA list or tuple of the file extensions (with or without the leading dot) for
templates that should be rendered with Jinja2.Defaults to('jjhtml', 'jjhtm')conditionA function taking as sole argument the path of the template file and
returning True if the file should be rendered with Jinja2. Defaults to a
function returning True if the extension is in JINJA2_JJ_EXTSextensionsA tuple or list of extensions to be loaded by jinja2 (as python objects or
paths to the python objects).Some extensionsare shipped with
djinga underdjinga.ext.*.globalsThe jinja2 globals as a dictionary.filtersThe jinja2 filters as a dictionary.load_fromA tuple or list of module paths to load globals and filters from. This
advantageously complements or replaces theglobalsandfiltersoptions. SeeAdding globals and filtersfor details.any_jinja2_optionAny other argument to construct a jinja2 environment may be provided.Jinja2 extensionsDjinga comes with several Jinja2 extensions:djinga.ext.staticProvides a{% static 'path' %}tag to refer to Django’s staticfiles
directorydjinga.ext.cssProvides a{% css 'rel/path/to/file.css' %}tag that generates a
HTML link element refering to the css file located at a relative path in
a css directory. The css directory’s path can be defined relatively to
Django’s staticfiles directory through the setting JINJA2_STATIC_CSSdjinga.ext.jsSame as djinga.ext.css but generates a HTML script element refering to a
javascript file. The js directory’s relative path can be set through the
setting JINJA2_STATIC_JSdjinga.ext.mediaSimply concatenates django’s MEDIA_URL to the argument provideddjinga.ext.djangoFroma PR on coffin.
Provides a{% django%}{%enddjango %}tag to include django template
language in a jinja2 template. For this tag to work, thedjango.core.context_processors.requestcontext processor must be
enabled.djinga.ext.csrf_tokenFromcoffinProvides a Django-like{% csrf_token %}tag.djinga.ext.urlProvides a tag for URL reversing, similar to the django templates one.djinga.ext.htmlcompress.HTMLCompress / SelectiveHTMLCompressBased onArmin Ronacher’s version.
Eliminates useless whitespace at template compilation time without extra
overhead. Since version 2.0, it also deals with inline javascript.Django template tagsThe following tags are automatically made available in any django template:extendsOverrides the standard{% extends %}tag and enables it to refer to
jinja2 files as well as normal django template files. While the template
engine for the current file remains Django’s one, the template engine for
the extended file can be either Jinja2 or Django, depending on the file
extension (indj_extsorjj_exts)Adding globals and filtersA straightforward way to add globals and filters and make them available from
your Jinja2 templates is to add them to theglobalsor thefiltersoptions in the settings module.However, this is not always convenient nor possible (import loops), and djinga
therefore provides a way to ease this process, through thejj_globalandjj_filterdecorators in combination with theload_fromoption.Basically, the decorators mark the functions as Jinja2 globals or filters,
while the setting (a list of module paths) indicates djinga where to look for
them.A short example is better than long explanations, so here we go.This:[my_app/my_module.py]
from djinga.register import jj_filter, jj_global

@jj_global
def my_tag(*args, **kw):
   pass

@jj_filter
def my_filter(*args, **kw)
   pass

[settings.py] # django 1.8+
TEMPLATES = [
   {
      'BACKEND': 'djinga.backends.djinga.DjingaTemplates',
      'OPTIONS': {
         'load_from': ('my_app.my_module',),
       },
   },
]

[settings.py] # django < 1.8
JINJA2_LOAD_FROM = (
   'my_app.my_module',
)is equivalent to this:[my_app/my_module.py]
def my_tag(*args):
   pass

def my_filter(*args, **kw)
   pass

[settings.py] # django 1.8+
from my_app.my_module import my_tag, my_filter
TEMPLATES = [
   {
      'BACKEND': 'djinga.backends.djinga.DjingaTemplates',
      'OPTIONS': {
         'globals': {'my_tag': my_tag},
         'filters': {'my_filter': my_filter},
       },
   },
]

[settings.py] # django < 1.8
from my_app.my_module import my_tag, my_filter
JINJA2_GLOBALS = {'my_tag': my_tag}
JINJA2_FILTERS = {'my_filter': my_filter}…with the significant advantage of not requiring a possibly issue-proneimportstatement in thesettingsmodule.Thejj_globalandjj_filterdecorators are compatible with any of theJinja2 built-in decorators. They do not affect the behavior nor the
signature of the decorated function, so you can use it normally (as a normal
Django template tag or filter, for example).The collected globals and filters are appended to the ones already specified
inglobalsandfilters.makemesssagesmanagement commandAdapted fromcoffin.Djinga overrides the Djangomakemessagescore management command to include
the specific Jinja2 translation tags and ensure the strings marked for
translation in Jinja2 templates appear in the translations dictionary.