Added TEMPLATE_STRING_IF_INVALID setting, which specifies what the template system should output in case of invalid variables. Default is empty string (to match current behavior)

git-svn-id: http://code.djangoproject.com/svn/django/trunk@2294 bcc190cf-cafb-0310-a4f2-bffc1f526a37
This commit is contained in:
Adrian Holovaty 2006-02-09 00:31:51 +00:00
parent ba8f23424b
commit e0c915ec39
5 changed files with 50 additions and 15 deletions

View File

@ -113,6 +113,9 @@ TEMPLATE_CONTEXT_PROCESSORS = (
# 'django.core.context_processors.request', # 'django.core.context_processors.request',
) )
# Output to use in template system for invalid (e.g. misspelled) variables.
TEMPLATE_STRING_IF_INVALID = ''
# URL prefix for admin media -- CSS, JavaScript and images. Make sure to use a # URL prefix for admin media -- CSS, JavaScript and images. Make sure to use a
# trailing slash. # trailing slash.
# Examples: "http://foo.com/media/", "/media/". # Examples: "http://foo.com/media/", "/media/".

View File

@ -57,7 +57,7 @@ times with multiple contexts)
import re import re
from inspect import getargspec from inspect import getargspec
from django.utils.functional import curry from django.utils.functional import curry
from django.conf.settings import DEFAULT_CHARSET, TEMPLATE_DEBUG from django.conf.settings import DEFAULT_CHARSET, TEMPLATE_DEBUG, TEMPLATE_STRING_IF_INVALID
__all__ = ('Template','Context','compile_string') __all__ = ('Template','Context','compile_string')
@ -181,7 +181,7 @@ class Context:
for dict in self.dicts: for dict in self.dicts:
if dict.has_key(key): if dict.has_key(key):
return dict[key] return dict[key]
return '' return TEMPLATE_STRING_IF_INVALID
def __delitem__(self, key): def __delitem__(self, key):
"Delete a variable from the current context" "Delete a variable from the current context"
@ -588,7 +588,7 @@ class FilterExpression(object):
try: try:
obj = resolve_variable(self.var, context) obj = resolve_variable(self.var, context)
except VariableDoesNotExist: except VariableDoesNotExist:
obj = '' obj = TEMPLATE_STRING_IF_INVALID
for func, args in self.filters: for func, args in self.filters:
arg_vals = [] arg_vals = []
for lookup, arg in args: for lookup, arg in args:
@ -657,7 +657,7 @@ def resolve_variable(path, context):
try: try:
current = number_type(path) current = number_type(path)
except ValueError: except ValueError:
current = '' current = TEMPLATE_STRING_IF_INVALID
elif path[0] in ('"', "'") and path[0] == path[-1]: elif path[0] in ('"', "'") and path[0] == path[-1]:
current = path[1:-1] current = path[1:-1]
else: else:
@ -671,16 +671,16 @@ def resolve_variable(path, context):
current = getattr(current, bits[0]) current = getattr(current, bits[0])
if callable(current): if callable(current):
if getattr(current, 'alters_data', False): if getattr(current, 'alters_data', False):
current = '' current = TEMPLATE_STRING_IF_INVALID
else: else:
try: # method call (assuming no args required) try: # method call (assuming no args required)
current = current() current = current()
except SilentVariableFailure: except SilentVariableFailure:
current = '' current = TEMPLATE_STRING_IF_INVALID
except TypeError: # arguments *were* required except TypeError: # arguments *were* required
# GOTCHA: This will also catch any TypeError # GOTCHA: This will also catch any TypeError
# raised in the function itself. # raised in the function itself.
current = '' # invalid method call current = TEMPLATE_STRING_IF_INVALID # invalid method call
except (TypeError, AttributeError): except (TypeError, AttributeError):
try: # list-index lookup try: # list-index lookup
current = current[int(bits[0])] current = current[int(bits[0])]

View File

@ -621,6 +621,18 @@ Default: ``('django.core.template.loaders.filesystem.load_template_source',)``
A tuple of callables (as strings) that know how to import templates from A tuple of callables (as strings) that know how to import templates from
various sources. See the `template documentation`_. various sources. See the `template documentation`_.
TEMPLATE_STRING_IF_INVALID
--------------------------
Default: ``''`` (Empty string)
**New in Django development version.**
Output, as a string, that the template system should use for invalid (e.g.
misspelled) variables. See `How invalid variables are handled`_.
.. _How invalid variables are handled: http://www.djangoproject.com/documentation/templates_python/#how-invalid-variables-are-handled
TIME_FORMAT TIME_FORMAT
----------- -----------

View File

@ -70,6 +70,12 @@ Use a dot (``.``) to access attributes of a variable.
In the above example, ``{{ section.title }}`` will be replaced with the In the above example, ``{{ section.title }}`` will be replaced with the
``title`` attribute of the ``section`` object. ``title`` attribute of the ``section`` object.
In Django 0.91, if you use a variable that doesn't exist, it will be silently
ignored; the variable will be replaced by nothingness. In the Django
development version, if a variable doesn't exist, the template system inserts
the value of the ``TEMPLATE_STRING_IF_INVALID`` setting, which is set to ``''``
(the empty string) by default.
If you use a variable that doesn't exist, it will be silently ignored. The If you use a variable that doesn't exist, it will be silently ignored. The
variable will be replaced by nothingness. variable will be replaced by nothingness.

View File

@ -135,14 +135,6 @@ Here are a few examples::
>>> t.render(c) >>> t.render(c)
"The first stooge in the list is Larry." "The first stooge in the list is Larry."
If a variable doesn't exist, the template system fails silently. The variable
is replaced with an empty string::
>>> t = Template("My name is {{ my_name }}.")
>>> c = Context({"foo": "bar"})
>>> t.render(c)
"My name is ."
Method lookups are slightly more complex than the other lookup types. Here are Method lookups are slightly more complex than the other lookup types. Here are
some things to keep in mind: some things to keep in mind:
@ -193,6 +185,28 @@ some things to keep in mind:
self.database_record.delete() self.database_record.delete()
sensitive_function.alters_data = True sensitive_function.alters_data = True
How invalid variables are handled
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
In Django 0.91, if a variable doesn't exist, the template system fails
silently. The variable is replaced with an empty string::
>>> t = Template("My name is {{ my_name }}.")
>>> c = Context({"foo": "bar"})
>>> t.render(c)
"My name is ."
This applies to any level of lookup::
>>> t = Template("My name is {{ person.fname }} {{ person.lname }}.")
>>> c = Context({"person": {"fname": "Stan"}})
>>> t.render(c)
"My name is Stan ."
In the Django development version, if a variable doesn't exist, the template
system inserts the value of the ``TEMPLATE_STRING_IF_INVALID`` setting, which
is set to ``''`` (the empty string) by default.
Playing with Context objects Playing with Context objects
---------------------------- ----------------------------