浏览代码

Encapsulated TEMPLATE_STRING_IF_INVALID in Engine.

Aymeric Augustin 10 年之前
父节点
当前提交
47a131b944
共有 3 个文件被更改,包括 16 次插入26 次删除
  1. 10 15
      django/template/base.py
  2. 1 1
      django/templatetags/i18n.py
  3. 5 10
      tests/template_tests/tests.py

+ 10 - 15
django/template/base.py

@@ -71,10 +71,6 @@ libraries = {}
 # global list of libraries to load by default for a new parser
 builtins = []
 
-# True if TEMPLATE_STRING_IF_INVALID contains a format string (%s). None means
-# uninitialized.
-invalid_var_format_string = None
-
 
 class TemplateSyntaxError(Exception):
     pass
@@ -601,15 +597,14 @@ class FilterExpression(object):
                 if ignore_failures:
                     obj = None
                 else:
-                    if settings.TEMPLATE_STRING_IF_INVALID:
-                        global invalid_var_format_string
-                        if invalid_var_format_string is None:
-                            invalid_var_format_string = '%s' in settings.TEMPLATE_STRING_IF_INVALID
-                        if invalid_var_format_string:
-                            return settings.TEMPLATE_STRING_IF_INVALID % self.var
-                        return settings.TEMPLATE_STRING_IF_INVALID
+                    string_if_invalid = context.engine.string_if_invalid
+                    if string_if_invalid:
+                        if '%s' in string_if_invalid:
+                            return string_if_invalid % self.var
+                        else:
+                            return string_if_invalid
                     else:
-                        obj = settings.TEMPLATE_STRING_IF_INVALID
+                        obj = string_if_invalid
         else:
             obj = self.var
         for func, args in self.filters:
@@ -794,7 +789,7 @@ class Variable(object):
                     if getattr(current, 'do_not_call_in_templates', False):
                         pass
                     elif getattr(current, 'alters_data', False):
-                        current = settings.TEMPLATE_STRING_IF_INVALID
+                        current = context.engine.string_if_invalid
                     else:
                         try:  # method call (assuming no args required)
                             current = current()
@@ -802,12 +797,12 @@ class Variable(object):
                             try:
                                 getcallargs(current)
                             except TypeError:  # arguments *were* required
-                                current = settings.TEMPLATE_STRING_IF_INVALID  # invalid method call
+                                current = context.engine.string_if_invalid  # invalid method call
                             else:
                                 raise
         except Exception as e:
             if getattr(e, 'silent_variable_failure', False):
-                current = settings.TEMPLATE_STRING_IF_INVALID
+                current = context.engine.string_if_invalid
             else:
                 raise
 

+ 1 - 1
django/templatetags/i18n.py

@@ -149,7 +149,7 @@ class BlockTranslateNode(Node):
                 result = translation.pgettext(message_context, singular)
             else:
                 result = translation.ugettext(singular)
-        default_value = settings.TEMPLATE_STRING_IF_INVALID
+        default_value = context.engine.string_if_invalid
 
         def render_value(key):
             if key in context:

+ 5 - 10
tests/template_tests/tests.py

@@ -12,8 +12,7 @@ from django import template
 from django.conf import settings
 from django.contrib.auth.models import Group
 from django.core import urlresolvers
-from django.template import (base as template_base, loader, Context,
-    RequestContext, Template, TemplateSyntaxError)
+from django.template import loader, Context, RequestContext, Template, TemplateSyntaxError
 from django.template.engine import Engine
 from django.template.loaders import app_directories, filesystem
 from django.test import RequestFactory, TestCase
@@ -550,14 +549,15 @@ class TemplateTests(TestCase):
             failures = []
             tests = sorted(template_tests.items())
 
-            # Set TEMPLATE_STRING_IF_INVALID to a known string.
-            expected_invalid_str = 'INVALID'
-
             # Warm the URL reversing cache. This ensures we don't pay the cost
             # warming the cache during one of the tests.
             urlresolvers.reverse('named.client', args=(0,))
 
             for name, vals in tests:
+
+                # Set TEMPLATE_STRING_IF_INVALID to a known string.
+                expected_invalid_str = 'INVALID'
+
                 if isinstance(vals[2], tuple):
                     normal_string_result = vals[2][0]
                     invalid_string_result = vals[2][1]
@@ -565,7 +565,6 @@ class TemplateTests(TestCase):
                     if isinstance(invalid_string_result, tuple):
                         expected_invalid_str = 'INVALID %s'
                         invalid_string_result = invalid_string_result[0] % invalid_string_result[1]
-                        template_base.invalid_var_format_string = True
 
                     try:
                         template_debug_result = vals[2][2]
@@ -622,10 +621,6 @@ class TemplateTests(TestCase):
 
                     Engine.get_default().template_loaders[0].reset()
 
-                if template_base.invalid_var_format_string:
-                    expected_invalid_str = 'INVALID'
-                    template_base.invalid_var_format_string = False
-
         self.assertEqual(failures, [], "Tests failed:\n%s\n%s" %
             ('-' * 70, ("\n%s\n" % ('-' * 70)).join(failures)))