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 | ||||
|     Ryan Kelly <ryan@rfk.id.au> | ||||
|     Ryan Niemeyer <https://profiles.google.com/ryan.niemeyer/about> | ||||
|     Ryan Rubin <ryanmrubin@gmail.com> | ||||
|     Ryno Mathee <rmathee@gmail.com> | ||||
|     Sam Newman <http://www.magpiebrain.com/> | ||||
|     Sander Dijkhuis <sander.dijkhuis@gmail.com> | ||||
|   | ||||
| @@ -53,7 +53,7 @@ times with multiple contexts) | ||||
| import logging | ||||
| import re | ||||
| 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 | ||||
|     BaseContext, Context, ContextPopException, RequestContext, | ||||
| @@ -707,7 +707,7 @@ class FilterExpression: | ||||
|         # First argument, filter input, is implied. | ||||
|         plen = len(provided) + 1 | ||||
|         # Check to see if a decorator is providing the real function. | ||||
|         func = getattr(func, '_decorated_function', func) | ||||
|         func = unwrap(func) | ||||
|  | ||||
|         args, _, _, defaults, _, _, _ = getfullargspec(func) | ||||
|         alen = len(args) | ||||
|   | ||||
| @@ -9,4 +9,5 @@ Django 2.0.6 fixes several bugs in 2.0.5. | ||||
| 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.template.defaultfilters import stringfilter | ||||
| from django.utils.html import escape, format_html | ||||
| from django.utils.safestring import mark_safe | ||||
|  | ||||
| register = template.Library() | ||||
|  | ||||
| @@ -13,6 +14,13 @@ def trim(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 | ||||
| def noop(value, param=None): | ||||
|     """A noop filter that always return its first argument and does nothing with | ||||
|   | ||||
| @@ -25,6 +25,11 @@ class CustomFilterTests(SimpleTestCase): | ||||
|             "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): | ||||
|  | ||||
|   | ||||
		Reference in New Issue
	
	Block a user