mirror of
https://github.com/django/django.git
synced 2025-01-03 15:06:09 +00:00
Fixed #34883 -- Allowed template tags to set extra data on templates.
By setting a value in the `parser.extra_data` mapping, template tags pass additional data out of the parsing context. Any extra data set is exposed on the template via the matching `.extra_data` attribute. Library authors should use a key to namespace extra data. The 'django' namespace is reserved for internal use.
This commit is contained in:
parent
f4e72e6523
commit
35bbb2c9c0
@ -193,7 +193,9 @@ class Template:
|
|||||||
)
|
)
|
||||||
|
|
||||||
try:
|
try:
|
||||||
return parser.parse()
|
nodelist = parser.parse()
|
||||||
|
self.extra_data = parser.extra_data
|
||||||
|
return nodelist
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
if self.engine.debug:
|
if self.engine.debug:
|
||||||
e.template_debug = self.get_exception_info(e, e.token)
|
e.template_debug = self.get_exception_info(e, e.token)
|
||||||
@ -439,6 +441,12 @@ class Parser:
|
|||||||
self.filters = {}
|
self.filters = {}
|
||||||
self.command_stack = []
|
self.command_stack = []
|
||||||
|
|
||||||
|
# Custom template tags may store additional data on the parser that
|
||||||
|
# will be made available on the template instance. Library authors
|
||||||
|
# should use a key to namespace any added data. The 'django' namespace
|
||||||
|
# is reserved for internal use.
|
||||||
|
self.extra_data = {}
|
||||||
|
|
||||||
if libraries is None:
|
if libraries is None:
|
||||||
libraries = {}
|
libraries = {}
|
||||||
if builtins is None:
|
if builtins is None:
|
||||||
|
@ -194,7 +194,9 @@ Signals
|
|||||||
Templates
|
Templates
|
||||||
~~~~~~~~~
|
~~~~~~~~~
|
||||||
|
|
||||||
* ...
|
* Custom tags may now set extra data on the ``Parser`` object that will later
|
||||||
|
be made available on the ``Template`` instance. Such data may be used, for
|
||||||
|
example, by the template loader, or other template clients.
|
||||||
|
|
||||||
Tests
|
Tests
|
||||||
~~~~~
|
~~~~~
|
||||||
|
@ -1,4 +1,5 @@
|
|||||||
from django import template
|
from django import template
|
||||||
|
from django.template.base import TextNode
|
||||||
from django.template.defaultfilters import stringfilter
|
from django.template.defaultfilters import stringfilter
|
||||||
from django.utils.html import escape, format_html
|
from django.utils.html import escape, format_html
|
||||||
from django.utils.safestring import mark_safe
|
from django.utils.safestring import mark_safe
|
||||||
@ -216,3 +217,9 @@ class CounterNode(template.Node):
|
|||||||
count = self.count
|
count = self.count
|
||||||
self.count = count + 1
|
self.count = count + 1
|
||||||
return str(count)
|
return str(count)
|
||||||
|
|
||||||
|
|
||||||
|
@register.tag("extra_data")
|
||||||
|
def do_extra_data(parser, token):
|
||||||
|
parser.extra_data["extra_data"] = "CUSTOM_DATA"
|
||||||
|
return TextNode("")
|
||||||
|
@ -140,6 +140,15 @@ class TemplateTestMixin:
|
|||||||
if self.debug_engine:
|
if self.debug_engine:
|
||||||
self.assertEqual(e.exception.template_debug["during"], "{% badtag %}")
|
self.assertEqual(e.exception.template_debug["during"], "{% badtag %}")
|
||||||
|
|
||||||
|
def test_compile_tag_extra_data(self):
|
||||||
|
"""Custom tags can pass extra data back to template."""
|
||||||
|
engine = self._engine(
|
||||||
|
app_dirs=True,
|
||||||
|
libraries={"custom": "template_tests.templatetags.custom"},
|
||||||
|
)
|
||||||
|
t = engine.from_string("{% load custom %}{% extra_data %}")
|
||||||
|
self.assertEqual(t.extra_data["extra_data"], "CUSTOM_DATA")
|
||||||
|
|
||||||
def test_render_tag_error_in_extended_block(self):
|
def test_render_tag_error_in_extended_block(self):
|
||||||
"""Errors in extended block are displayed correctly."""
|
"""Errors in extended block are displayed correctly."""
|
||||||
e = self._engine(app_dirs=True)
|
e = self._engine(app_dirs=True)
|
||||||
|
Loading…
Reference in New Issue
Block a user