mirror of
https://github.com/django/django.git
synced 2024-12-22 17:16:24 +00:00
Fixed #29400 -- Fixed crash in custom template filters that use decorated functions.
Regression in 620e9dd31a
.
This commit is contained in:
parent
96ea4f875b
commit
a8d12bc280
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):
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user