summaryrefslogtreecommitdiff
path: root/django
diff options
context:
space:
mode:
authorMalcolm Tredinnick <malcolm.tredinnick@gmail.com>2009-04-11 12:03:52 +0000
committerMalcolm Tredinnick <malcolm.tredinnick@gmail.com>2009-04-11 12:03:52 +0000
commitb1a5db37e6631ab4a964d7f8d52dfe593f9e6c4b (patch)
tree3ce24d81abffe8ec5ca053f22f7849566cffe866 /django
parentd18f75af447bc18b062564ab163943c16d79effc (diff)
Fixed #10369 -- Fixed auto-escaping inside "tran" and "blocktrans" tags.
Patch from Andrew Badr. git-svn-id: http://code.djangoproject.com/svn/django/trunk@10519 bcc190cf-cafb-0310-a4f2-bffc1f526a37
Diffstat (limited to 'django')
-rw-r--r--django/template/__init__.py19
-rw-r--r--django/templatetags/i18n.py6
2 files changed, 17 insertions, 8 deletions
diff --git a/django/template/__init__.py b/django/template/__init__.py
index 95aa36af21..5493e5bbb7 100644
--- a/django/template/__init__.py
+++ b/django/template/__init__.py
@@ -801,6 +801,18 @@ class TextNode(Node):
def render(self, context):
return self.s
+
+def _render_value_in_context(value, context):
+ """
+ Converts any value to a string to become part of a rendered template. This
+ means escaping, if required, and conversion to a unicode object. If value
+ is a string, it is expected to have already been translated.
+ """
+ value = force_unicode(value)
+ if (context.autoescape and not isinstance(value, SafeData)) or isinstance(value, EscapeData):
+ return escape(value)
+ else:
+ return value
class VariableNode(Node):
def __init__(self, filter_expression):
@@ -811,15 +823,12 @@ class VariableNode(Node):
def render(self, context):
try:
- output = force_unicode(self.filter_expression.resolve(context))
+ output = self.filter_expression.resolve(context)
except UnicodeDecodeError:
# Unicode conversion can fail sometimes for reasons out of our
# control (e.g. exception rendering). In that case, we fail quietly.
return ''
- if (context.autoescape and not isinstance(output, SafeData)) or isinstance(output, EscapeData):
- return force_unicode(escape(output))
- else:
- return force_unicode(output)
+ return _render_value_in_context(output, context)
def generic_tag_compiler(params, defaults, name, node_class, parser, token):
"Returns a template.Node subclass."
diff --git a/django/templatetags/i18n.py b/django/templatetags/i18n.py
index 190cb70128..046743323c 100644
--- a/django/templatetags/i18n.py
+++ b/django/templatetags/i18n.py
@@ -1,6 +1,6 @@
import re
-from django.template import Node, Variable, VariableNode
+from django.template import Node, Variable, VariableNode, _render_value_in_context
from django.template import TemplateSyntaxError, TokenParser, Library
from django.template import TOKEN_TEXT, TOKEN_VAR
from django.utils import translation
@@ -43,7 +43,7 @@ class TranslateNode(Node):
if self.noop:
return value
else:
- return translation.ugettext(value)
+ return _render_value_in_context(translation.ugettext(value), context)
class BlockTranslateNode(Node):
def __init__(self, extra_context, singular, plural=None, countervar=None,
@@ -82,7 +82,7 @@ class BlockTranslateNode(Node):
result = translation.ugettext(singular)
# Escape all isolated '%' before substituting in the context.
result = re.sub(u'%(?!\()', u'%%', result)
- data = dict([(v, force_unicode(context[v])) for v in vars])
+ data = dict([(v, _render_value_in_context(context[v], context)) for v in vars])
context.pop()
return result % data