Opened 19 years ago
Last modified 18 years ago
#911 closed defect
[patch] Make template system scoped to the parser — at Version 2
Reported by: | rjwittams | Owned by: | Adrian Holovaty |
---|---|---|---|
Component: | contrib.admin | Version: | |
Severity: | normal | Keywords: | |
Cc: | Triage Stage: | Unreviewed | |
Has patch: | yes | Needs documentation: | no |
Needs tests: | no | Patch needs improvement: | no |
Easy pickings: | no | UI/UX: | no |
Description (last modified by )
So currently, template tags and filters are loaded into module level dictionaries.
This means that tags and filters are available in places that they haven't been loaded.
What this leads to is namespace pollution by previous requests - so your code might work one minute, as a previous request loaded the lib, and break the next if you are the first request.
So this patch moves filters and tags onto parsers. As a bonus, filters are now parsed at compile time rather than runtime, so they don't get parsed multiple times in loops.
The changes are:
At the top of a tag/filter library,
do
import django.core.template register = template.Library()
then to register tags or filters, use
register.tag('name', func) register.filter('name', func) # No has_arg, see below
In tags, resolve_variable_with_filters is gone.
The functionality is split in two.
In your compile function, do
filter_expr = parser.compile(filter_string)
pass this into your node class as usual.
in render, do
filter_result = filter_expr.resolve(context)
instead of resolve_variable_with_filters.
the tag decorators are also now members of the library class, so do
@register.simple_tag
and
@register.inclusion_tag('cow_detail')
for those.
Filters can now have default arguments, and whether they have an argument is inferred from the signature. So any
def filter_func(obj, _):
should be changed to
def filter_func(obj):
and the has_arg function is no longer accepted or useful.
Filter arguments can be also now be variables which are resolved in the context as well as constant strings.
Change History (3)
comment:1 by , 19 years ago
Description: | modified (diff) |
---|
comment:2 by , 19 years ago
Description: | modified (diff) |
---|
by , 19 years ago
Attachment: | django-template-scoping.diff added |
---|
(Fixed formatting in description.)