Django

Code

Show
Ignore:
Timestamp:
06/25/08 23:54:10 (7 months ago)
Author:
adrian
Message:

Fixed #6201 -- Improved the {% cache %} template tag to allow the timeout to be a template variable. Inspired by the patch by zz and edrik

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • django/trunk/django/templatetags/cache.py

    r7294 r7754  
    1 from django.template import Library, Node, TemplateSyntaxError 
     1from django.template import Library, Node, TemplateSyntaxError, Variable, VariableDoesNotExist 
    22from django.template import resolve_variable 
    33from django.core.cache import cache 
     
    77 
    88class CacheNode(Node): 
    9     def __init__(self, nodelist, expire_time, fragment_name, vary_on): 
     9    def __init__(self, nodelist, expire_time_var, fragment_name, vary_on): 
    1010        self.nodelist = nodelist 
    11         self.expire_time = expire_time 
     11        self.expire_time_var = Variable(expire_time_var) 
    1212        self.fragment_name = fragment_name 
    1313        self.vary_on = vary_on 
    1414 
    1515    def render(self, context): 
     16        try: 
     17            expire_time = self.expire_time_var.resolve(context) 
     18        except VariableDoesNotExist: 
     19            raise TemplateSyntaxError('"cache" tag got an unknkown variable: %r' % self.expire_time_var.var) 
     20        try: 
     21            expire_time = int(expire_time) 
     22        except (ValueError, TypeError): 
     23            raise TemplateSyntaxError('"cache" tag got a non-integer timeout value: %r' % expire_time) 
    1624        # Build a unicode key for this fragment and all vary-on's. 
    17         cache_key = u':'.join([self.fragment_name] + \ 
    18             [force_unicode(resolve_variable(var, context)) for var in self.vary_on]) 
     25        cache_key = u':'.join([self.fragment_name] + [force_unicode(resolve_variable(var, context)) for var in self.vary_on]) 
    1926        value = cache.get(cache_key) 
    2027        if value is None: 
    2128            value = self.nodelist.render(context) 
    22             cache.set(cache_key, value, self.expire_time) 
     29            cache.set(cache_key, value, expire_time) 
    2330        return value 
    2431 
     
    4956    if len(tokens) < 3: 
    5057        raise TemplateSyntaxError(u"'%r' tag requires at least 2 arguments." % tokens[0]) 
    51     try: 
    52         expire_time = int(tokens[1]) 
    53     except ValueError: 
    54         raise TemplateSyntaxError(u"First argument to '%r' must be an integer (got '%s')." % (tokens[0], tokens[1])) 
    55     return CacheNode(nodelist, expire_time, tokens[2], tokens[3:]) 
     58    return CacheNode(nodelist, tokens[1], tokens[2], tokens[3:]) 
    5659 
    5760register.tag('cache', do_cache)