Fixes #15732 -- better introduction of template filter decorator concepts (first register, then stringfilter). Thanks for the patch, hahasee.

git-svn-id: http://code.djangoproject.com/svn/django/trunk@16251 bcc190cf-cafb-0310-a4f2-bffc1f526a37
This commit is contained in:
Chris Beaven 2011-05-20 02:42:28 +00:00
parent 90e8e48239
commit 803a454aef
1 changed files with 22 additions and 20 deletions

View File

@ -105,23 +105,6 @@ your function. Example::
"Converts a string into all lowercase" "Converts a string into all lowercase"
return value.lower() return value.lower()
Template filters that expect strings
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
If you're writing a template filter that only expects a string as the first
argument, you should use the decorator ``stringfilter``. This will
convert an object to its string value before being passed to your function::
from django.template.defaultfilters import stringfilter
@stringfilter
def lower(value):
return value.lower()
This way, you'll be able to pass, say, an integer to this filter, and it
won't cause an ``AttributeError`` (because integers don't have ``lower()``
methods).
Registering custom filters Registering custom filters
~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~
@ -140,17 +123,36 @@ The ``Library.filter()`` method takes two arguments:
You can use ``register.filter()`` as a decorator instead:: You can use ``register.filter()`` as a decorator instead::
@register.filter(name='cut') @register.filter(name='cut')
@stringfilter
def cut(value, arg): def cut(value, arg):
return value.replace(arg, '') return value.replace(arg, '')
@register.filter
def lower(value):
return value.lower()
If you leave off the ``name`` argument, as in the second example above, Django
will use the function's name as the filter name.
Template filters that expect strings
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
If you're writing a template filter that only expects a string as the first
argument, you should use the decorator ``stringfilter``. This will
convert an object to its string value before being passed to your function::
from django import template
from django.template.defaultfilters import stringfilter
register = template.Library()
@register.filter @register.filter
@stringfilter @stringfilter
def lower(value): def lower(value):
return value.lower() return value.lower()
If you leave off the ``name`` argument, as in the second example above, Django This way, you'll be able to pass, say, an integer to this filter, and it
will use the function's name as the filter name. won't cause an ``AttributeError`` (because integers don't have ``lower()``
methods).
Filters and auto-escaping Filters and auto-escaping
~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~