Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Make django templates strict

In a django template, a call to {{ var }} will silently fail if var is undefined. That makes templates hard to debug. Is there a setting I can switch so django will throw an exception in this case?

The only hint at a solution I've found online is http://groups.google.com/group/google-appengine/browse_thread/thread/86a5b12ff868038d and that sounds awfully hacky.

like image 824
pseudosudo Avatar asked Jan 24 '12 16:01

pseudosudo


3 Answers

This hack from djangosnippets will raise an exception when an undefined variable is encountered in a template.

# settings.py
class InvalidVarException(object):
    def __mod__(self, missing):
        try:
            missing_str = unicode(missing)
        except:
            missing_str = 'Failed to create string representation'
        raise Exception('Unknown template variable %r %s' % (missing, missing_str))
    def __contains__(self, search):
        if search == '%s':
            return True
        return False

TEMPLATE_DEBUG = True
TEMPLATE_STRING_IF_INVALID = InvalidVarException()
like image 180
utapyngo Avatar answered Oct 12 '22 01:10

utapyngo


Consider using the django-shouty-templates app: https://pypi.org/project/django-shouty-templates/

This app applies a monkeypatch which forces Django’s template language to error far more loudly about invalid assumptions. Specifically:

  • chef would raise an exception if the variable were called sous_chef.
  • chef.can_add_cakes would raise an exception if can_add_cakes was not a valid attribute/property/method of chef

It ain’t compile time safety, but it’s better than silently swallowing errors because you forgot something!

like image 23
Kris Avatar answered Oct 12 '22 00:10

Kris


Django<=1.9

Set TEMPLATE_STRING_IF_INVALID = 'DEBUG WARNING: undefined template variable [%s] not found' in your settings.py.

See docs:
https://docs.djangoproject.com/en/1.9/ref/settings/#template-string-if-invalid

Django>=1.10

Set string_if_invalid = 'DEBUG WARNING: undefined template variable [%s] not found' template option in your settings.py.

See docs: https://docs.djangoproject.com/en/2.0/topics/templates/#module-django.template.backends.django

Also read: http://docs.djangoproject.com/en/dev/ref/templates/api/#invalid-template-variables

like image 35
seler Avatar answered Oct 12 '22 01:10

seler