mirror of
				https://github.com/django/django.git
				synced 2025-10-31 09:41:08 +00:00 
			
		
		
		
	[2.1.x] Fixed #29400 -- Fixed crash in custom template filters that use decorated functions.
Regression in620e9dd31a. Backport ofa8d12bc280from master
This commit is contained in:
		
							
								
								
									
										1
									
								
								AUTHORS
									
									
									
									
									
								
							
							
						
						
									
										1
									
								
								AUTHORS
									
									
									
									
									
								
							| @@ -722,6 +722,7 @@ answer newbie questions, and generally made Django that much better: | |||||||
|     ryankanno |     ryankanno | ||||||
|     Ryan Kelly <ryan@rfk.id.au> |     Ryan Kelly <ryan@rfk.id.au> | ||||||
|     Ryan Niemeyer <https://profiles.google.com/ryan.niemeyer/about> |     Ryan Niemeyer <https://profiles.google.com/ryan.niemeyer/about> | ||||||
|  |     Ryan Rubin <ryanmrubin@gmail.com> | ||||||
|     Ryno Mathee <rmathee@gmail.com> |     Ryno Mathee <rmathee@gmail.com> | ||||||
|     Sam Newman <http://www.magpiebrain.com/> |     Sam Newman <http://www.magpiebrain.com/> | ||||||
|     Sander Dijkhuis <sander.dijkhuis@gmail.com> |     Sander Dijkhuis <sander.dijkhuis@gmail.com> | ||||||
|   | |||||||
| @@ -53,7 +53,7 @@ times with multiple contexts) | |||||||
| import logging | import logging | ||||||
| import re | import re | ||||||
| from enum import Enum | from enum import Enum | ||||||
| from inspect import getcallargs, getfullargspec | from inspect import getcallargs, getfullargspec, unwrap | ||||||
|  |  | ||||||
| from django.template.context import (  # NOQA: imported for backwards compatibility | from django.template.context import (  # NOQA: imported for backwards compatibility | ||||||
|     BaseContext, Context, ContextPopException, RequestContext, |     BaseContext, Context, ContextPopException, RequestContext, | ||||||
| @@ -707,7 +707,7 @@ class FilterExpression: | |||||||
|         # First argument, filter input, is implied. |         # First argument, filter input, is implied. | ||||||
|         plen = len(provided) + 1 |         plen = len(provided) + 1 | ||||||
|         # Check to see if a decorator is providing the real function. |         # Check to see if a decorator is providing the real function. | ||||||
|         func = getattr(func, '_decorated_function', func) |         func = unwrap(func) | ||||||
|  |  | ||||||
|         args, _, _, defaults, _, _, _ = getfullargspec(func) |         args, _, _, defaults, _, _, _ = getfullargspec(func) | ||||||
|         alen = len(args) |         alen = len(args) | ||||||
|   | |||||||
| @@ -9,4 +9,5 @@ Django 2.0.6 fixes several bugs in 2.0.5. | |||||||
| Bugfixes | Bugfixes | ||||||
| ======== | ======== | ||||||
|  |  | ||||||
| * ... | * Fixed a regression that broke custom template filters that use decorators | ||||||
|  |   (:ticket:`29400`). | ||||||
|   | |||||||
| @@ -3,6 +3,7 @@ import operator | |||||||
| from django import template | from django import template | ||||||
| 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 | ||||||
|  |  | ||||||
| register = template.Library() | register = template.Library() | ||||||
|  |  | ||||||
| @@ -13,6 +14,13 @@ def trim(value, num): | |||||||
|     return value[:num] |     return value[:num] | ||||||
|  |  | ||||||
|  |  | ||||||
|  | @register.filter | ||||||
|  | @mark_safe | ||||||
|  | def make_data_div(value): | ||||||
|  |     """A filter that uses a decorator (@mark_safe).""" | ||||||
|  |     return '<div data-name="%s"></div>' % value | ||||||
|  |  | ||||||
|  |  | ||||||
| @register.filter | @register.filter | ||||||
| def noop(value, param=None): | def noop(value, param=None): | ||||||
|     """A noop filter that always return its first argument and does nothing with |     """A noop filter that always return its first argument and does nothing with | ||||||
|   | |||||||
| @@ -25,6 +25,11 @@ class CustomFilterTests(SimpleTestCase): | |||||||
|             "abcde" |             "abcde" | ||||||
|         ) |         ) | ||||||
|  |  | ||||||
|  |     def test_decorated_filter(self): | ||||||
|  |         engine = Engine(libraries=LIBRARIES) | ||||||
|  |         t = engine.from_string('{% load custom %}{{ name|make_data_div }}') | ||||||
|  |         self.assertEqual(t.render(Context({'name': 'foo'})), '<div data-name="foo"></div>') | ||||||
|  |  | ||||||
|  |  | ||||||
| class TagTestCase(SimpleTestCase): | class TagTestCase(SimpleTestCase): | ||||||
|  |  | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user