Django

Code

Changeset 1443

Show
Ignore:
Timestamp:
11/26/05 16:46:31 (2 years ago)
Author:
adrian
Message:

Fixed #911 -- Made template system scoped to the parser instead of the template module. Also changed the way tags/filters are registered and added support for multiple arguments to {% load %} tag. Thanks, rjwittams. This is a backwards-incompatible change for people who've created custom template tags or filters. See http://code.djangoproject.com/wiki/BackwardsIncompatibleChanges for upgrade instructions.

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • django/trunk/django/contrib/admin/templates/admin/change_form.html

    r1434 r1443  
    11{% extends "admin/base_site" %} 
    2 {% load i18n %} 
    3 {% load admin_modify %} 
    4 {% load adminmedia %} 
     2{% load i18n admin_modify adminmedia %} 
    53{% block extrahead %} 
    64{% for js in bound_manipulator.javascript_imports %}{% include_admin_script js %}{% endfor %} 
  • django/trunk/django/contrib/admin/templates/admin/change_list.html

    r1434 r1443  
    1 {% load admin_list %} 
    2 {% load i18n %} 
     1{% load adminmedia admin_list i18n %} 
    32{% extends "admin/base_site" %} 
    43{% block bodyclass %}change-list{% endblock %} 
  • django/trunk/django/contrib/admin/templates/admin/edit_inline_stacked.html

    r1434 r1443  
     1{% load admin_modify %} 
    12<fieldset class="module aligned"> 
    23   {% for fcw in bound_related_object.form_field_collection_wrappers %} 
  • django/trunk/django/contrib/admin/templates/admin/edit_inline_tabular.html

    r1434 r1443  
     1{% load admin_modify %} 
    12<fieldset class="module"> 
    23   <h2>{{ bound_related_object.relation.opts.verbose_name_plural|capfirst }}</h2><table> 
  • django/trunk/django/contrib/admin/templates/admin/field_line.html

    r1434 r1443  
     1{% load admin_modify %} 
    12<div class="{{ class_names }}" > 
    23{% for bound_field in bound_fields %}{{ bound_field.html_error_list }}{% endfor %} 
  • django/trunk/django/contrib/admin/templates/admin/filter.html

    r1434 r1443  
     1{% load i18n %} 
    12<h3>{% blocktrans %} By {{ title }} {% endblocktrans %}</h3> 
    23<ul> 
  • django/trunk/django/contrib/admin/templates/admin/filters.html

    r1434 r1443  
     1{% load admin_list %} 
    12{% if cl.has_filters %}<div id="changelist-filter"> 
    23<h2>Filter</h2> 
  • django/trunk/django/contrib/admin/templates/admin/pagination.html

    r1434 r1443  
     1{% load admin_list %} 
    12<p class="paginator"> 
    23{% if pagination_required %} 
  • django/trunk/django/contrib/admin/templates/admin/search_form.html

    r1434 r1443  
     1{% load adminmedia %} 
    12{% if cl.lookup_opts.admin.search_fields %} 
    23<div id="toolbar"><form id="changelist-search" action="" method="get"> 
  • django/trunk/django/contrib/admin/templates/widget/default.html

    r1434 r1443  
    1 {% output_all bound_field.form_fields %} 
     1{% load admin_modify %}{% output_all bound_field.form_fields %} 
  • django/trunk/django/contrib/admin/templates/widget/file.html

    r1434 r1443  
    1 {% if bound_field.original_value %} 
     1{% load admin_modify %}{% if bound_field.original_value %} 
    22Currently: <a href="{{ bound_field.original_url }}" > {{ bound_field.original_value }} </a><br /> 
    33Change: {% output_all bound_field.form_fields %} 
  • django/trunk/django/contrib/admin/templates/widget/foreign.html

    r1434 r1443  
     1{% load admin_modify adminmedia %} 
    12{% output_all bound_field.form_fields %} 
    23{% if bound_field.raw_id_admin %} 
     
    56{% if bound_field.needs_add_label %} 
    67            <a href="../../../{{ bound_field.field.rel.to.app_label }}/{{ bound_field.field.rel.to.module_name }}/add/" class="add-another" id="add_{{ bound_field.element_id}}" onclick="return showAddAnotherPopup(this);"> <img src="{% admin_media_prefix %}img/admin/icon_addlink.gif" width="10" height="10" alt="Add Another"/></a> 
    7 {% endif %} {% endif %} 
     8{% endif %}{% endif %} 
  • django/trunk/django/contrib/admin/templatetags/adminapplist.py

    r948 r1443  
    11from django.core import template 
     2 
     3register = template.Library() 
    24 
    35class AdminApplistNode(template.Node): 
     
    5557    return AdminApplistNode(tokens[2]) 
    5658 
    57 template.register_tag('get_admin_app_list', get_admin_app_list) 
     59register.tag('get_admin_app_list', get_admin_app_list) 
  • django/trunk/django/contrib/admin/templatetags/admin_list.py

    r1434 r1443  
    44from django.core import meta, template 
    55from django.core.exceptions import ObjectDoesNotExist 
    6 from django.core.template.decorators import simple_tag, inclusion_tag 
    76from django.utils import dateformat 
    87from django.utils.html import strip_tags, escape 
     
    109from django.utils.translation import get_date_formats 
    1110from django.conf.settings import ADMIN_MEDIA_PREFIX 
     11from django.core.template import Library 
     12 
     13register = Library() 
    1214 
    1315DOT = '.' 
    1416 
    15 #@simple_tag 
     17#@register.simple_tag 
    1618def paginator_number(cl,i): 
    1719    if i == DOT: 
     
    2123    else: 
    2224       return '<a href="%s"%s>%d</a> ' % (cl.get_query_string({PAGE_VAR: i}), (i == cl.paginator.pages-1 and ' class="end"' or ''), i+1) 
    23 paginator_number = simple_tag(paginator_number) 
    24  
    25 #@inclusion_tag('admin/pagination') 
     25paginator_number = register.simple_tag(paginator_number) 
     26 
     27#@register.inclusion_tag('admin/pagination') 
    2628def pagination(cl): 
    2729    paginator, page_num = cl.paginator, cl.page_num 
     
    6567        '1': 1, 
    6668    } 
    67 pagination = inclusion_tag('admin/pagination')(pagination) 
     69pagination = register.inclusion_tag('admin/pagination')(pagination) 
    6870 
    6971def result_headers(cl): 
     
    178180        yield list(items_for_result(cl,res)) 
    179181 
    180 #@inclusion_tag("admin/change_list_results") 
     182#@register.inclusion_tag("admin/change_list_results") 
    181183def result_list(cl): 
    182184    res = list(results(cl)) 
     
    184186            'result_headers': list(result_headers(cl)), 
    185187            'results': list(results(cl))} 
    186 result_list = inclusion_tag("admin/change_list_results")(result_list) 
    187  
    188 #@inclusion_tag("admin/date_hierarchy") 
     188result_list = register.inclusion_tag("admin/change_list_results")(result_list) 
     189 
     190#@register.inclusion_tag("admin/date_hierarchy") 
    189191def date_hierarchy(cl): 
    190192    lookup_opts, params, lookup_params, lookup_mod = \ 
     
    257259                } for year in years ] 
    258260            } 
    259 date_hierarchy = inclusion_tag('admin/date_hierarchy')(date_hierarchy) 
    260  
    261 #@inclusion_tag('admin/search_form') 
     261date_hierarchy = register.inclusion_tag('admin/date_hierarchy')(date_hierarchy) 
     262 
     263#@register.inclusion_tag('admin/search_form') 
    262264def search_form(cl): 
    263265    return { 
     
    266268        'search_var': SEARCH_VAR 
    267269    } 
    268 search_form = inclusion_tag('admin/search_form')(search_form) 
    269  
    270 #@inclusion_tag('admin/filter') 
     270search_form = register.inclusion_tag('admin/search_form')(search_form) 
     271 
     272#@register.inclusion_tag('admin/filter') 
    271273def filter(cl, spec): 
    272274    return {'title': spec.title(), 'choices' : list(spec.choices(cl))} 
    273 filter = inclusion_tag('admin/filter')(filter) 
    274  
    275 #@inclusion_tag('admin/filters') 
     275filter = register.inclusion_tag('admin/filter')(filter) 
     276 
     277#@register.inclusion_tag('admin/filters') 
    276278def filters(cl): 
    277279    return {'cl': cl} 
    278 filters = inclusion_tag('admin/filters')(filters) 
     280filters = register.inclusion_tag('admin/filters')(filters) 
  • django/trunk/django/contrib/admin/templatetags/adminmedia.py

    r1411 r1443  
    1 from django.core.template.decorators import simple_tag 
     1from django.core.template import Library 
     2register = Library() 
    23 
    34def admin_media_prefix(): 
     
    78        return '' 
    89    return ADMIN_MEDIA_PREFIX 
    9 admin_media_prefix = simple_tag(admin_media_prefix) 
     10admin_media_prefix = register.simple_tag(admin_media_prefix) 
  • django/trunk/django/contrib/admin/templatetags/admin_modify.py

    r1434 r1443  
    33from django.utils.text import capfirst 
    44from django.utils.functional import curry 
    5 from django.core.template.decorators import simple_tag, inclusion_tag 
    65from django.contrib.admin.views.main import AdminBoundField 
    76from django.core.meta.fields import BoundField, Field 
     
    109import re 
    1110 
     11register = template.Library() 
     12 
    1213word_re = re.compile('[A-Z][a-z]+') 
    1314 
     
    1516    return '_'.join([s.lower() for s in word_re.findall(name)[:-1]]) 
    1617 
    17 #@simple_tag 
     18#@register.simple_tag 
    1819def include_admin_script(script_path): 
    1920    return '<script type="text/javascript" src="%s%s"></script>' % (ADMIN_MEDIA_PREFIX, script_path) 
    20 include_admin_script = simple_tag(include_admin_script) 
    21  
    22 #@inclusion_tag('admin/submit_line', takes_context=True) 
     21include_admin_script = register.simple_tag(include_admin_script) 
     22 
     23#@register.inclusion_tag('admin/submit_line', takes_context=True) 
    2324def submit_row(context, bound_manipulator): 
    2425    change = context['change'] 
     
    3738        'show_save': True 
    3839    } 
    39 submit_row = inclusion_tag('admin/submit_line', takes_context=True)(submit_row) 
    40  
    41 #@simple_tag 
     40submit_row = register.inclusion_tag('admin/submit_line', takes_context=True)(submit_row) 
     41 
     42#@register.simple_tag 
    4243def field_label(bound_field): 
    4344    class_names = [] 
     
    5455    return '<label for="%s"%s>%s%s</label> ' % (bound_field.element_id, class_str, \ 
    5556        capfirst(bound_field.field.verbose_name), colon) 
    56 field_label = simple_tag(field_label) 
     57field_label = register.simple_tag(field_label) 
    5758 
    5859class FieldWidgetNode(template.Node): 
     
    171172        return output 
    172173 
    173 #@simple_tag 
     174#@register.simple_tag 
    174175def output_all(form_fields): 
    175176    return ''.join([str(f) for f in form_fields]) 
    176 output_all = simple_tag(output_all) 
    177  
    178 #@simple_tag 
     177output_all = register.simple_tag(output_all) 
     178 
     179#@register.simple_tag 
    179180def auto_populated_field_script(auto_pop_fields, change = False): 
    180181    for field in auto_pop_fields: 
     
    192193                     f, field.name, add_values, field.maxlength)) 
    193194    return ''.join(t) 
    194 auto_populated_field_script = simple_tag(auto_populated_field_script) 
    195  
    196 #@simple_tag 
     195auto_populated_field_script = register.simple_tag(auto_populated_field_script) 
     196 
     197#@register.simple_tag 
    197198def filter_interface_script_maybe(bound_field): 
    198199    f = bound_field.field 
     
    203204    else: 
    204205        return '' 
    205 filter_interface_script_maybe = simple_tag(filter_interface_script_maybe) 
     206filter_interface_script_maybe = register.simple_tag(filter_interface_script_maybe) 
    206207 
    207208def do_one_arg_tag(node_factory, parser,token): 
     
    214215    tag_name = class_name_to_underscored(node.__name__) 
    215216    parse_func = curry(do_one_arg_tag, node) 
    216     template.register_tag(tag_name, parse_func) 
     217    register.tag(tag_name, parse_func) 
    217218 
    218219one_arg_tag_nodes = ( 
     
    224225    register_one_arg_tag(node) 
    225226 
    226 #@inclusion_tag('admin/field_line', takes_context=True) 
     227#@register.inclusion_tag('admin/field_line', takes_context=True) 
    227228def admin_field_line(context, argument_val): 
    228229    if (isinstance(argument_val, BoundField)): 
     
    250251        'class_names': " ".join(class_names), 
    251252    } 
    252 admin_field_line = inclusion_tag('admin/field_line', takes_context=True)(admin_field_line) 
    253  
    254 #@simple_tag 
     253admin_field_line = register.inclusion_tag('admin/field_line', takes_context=True)(admin_field_line) 
     254 
     255#@register.simple_tag 
    255256def object_pk(bound_manip, ordered_obj): 
    256257    return bound_manip.get_ordered_object_pk(ordered_obj) 
    257258 
    258 object_pk = simple_tag(object_pk) 
     259object_pk = register.simple_tag(object_pk) 
  • django/trunk/django/contrib/admin/templatetags/log.py

    r948 r1443  
    11from django.models.admin import log 
    22from django.core import template 
     3 
     4register = template.Library() 
    35 
    46class AdminLogNode(template.Node): 
     
    4951        return AdminLogNode(limit=tokens[1], varname=tokens[3], user=(len(tokens) > 5 and tokens[5] or None)) 
    5052 
    51 template.register_tag('get_admin_log', DoGetAdminLog('get_admin_log')) 
     53register.tag('get_admin_log', DoGetAdminLog('get_admin_log')) 
  • django/trunk/django/contrib/admin/views/template.py

    r948 r1443  
    5151 
    5252        # so that inheritance works in the site's context, register a new function 
    53         # for "extends" that uses the site's TEMPLATE_DIR instead 
     53        # for "extends" that uses the site's TEMPLATE_DIRS instead. 
    5454        def new_do_extends(parser, token): 
    5555            node = loader.do_extends(parser, token) 
    5656            node.template_dirs = settings_module.TEMPLATE_DIRS 
    5757            return node 
    58         template.register_tag('extends', new_do_extends) 
     58        register = template.Library() 
     59        register.tag('extends', new_do_extends) 
     60        template.builtins.append(register) 
    5961 
    60         # now validate the template using the new template dirs 
    61         # making sure to reset the extends function in any case 
     62        # Now validate the template using the new template dirs 
     63        # making sure to reset the extends function in any case. 
    6264        error = None 
    6365        try: 
     
    6668        except template.TemplateSyntaxError, e: 
    6769            error = e 
    68         template.register_tag('extends', loader.do_extends
     70        template.builtins.remove(register
    6971        if error: 
    7072            raise validators.ValidationError, e.args 
  • django/trunk/django/contrib/comments/templatetags/comments.py

    r1378 r1443  
    66from django.models.core import contenttypes 
    77import re 
     8 
     9register = template.Library() 
    810 
    911COMMENT_FORM = ''' 
     
    361363 
    362364# registration comments 
    363 template.register_tag('get_comment_list', DoGetCommentList(False)) 
    364 template.register_tag('comment_form', DoCommentForm(False)) 
    365 template.register_tag('get_comment_count', DoCommentCount(False)) 
     365register.tag('get_comment_list', DoGetCommentList(False)) 
     366register.tag('comment_form', DoCommentForm(False)) 
     367register.tag('get_comment_count', DoCommentCount(False)) 
    366368# free comments 
    367 template.register_tag('get_free_comment_list', DoGetCommentList(True)) 
    368 template.register_tag('free_comment_form', DoCommentForm(True)) 
    369 template.register_tag('get_free_comment_count', DoCommentCount(True)) 
     369register.tag('get_free_comment_list', DoGetCommentList(True)) 
     370register.tag('free_comment_form', DoCommentForm(True)) 
     371register.tag('get_free_comment_count', DoCommentCount(True)) 
  • django/trunk/django/contrib/markup/templatetags/markup.py

    r467 r1443  
    55    * Textile, which requires the PyTextile library available at 
    66      http://dealmeida.net/projects/textile/ 
    7        
     7 
    88    * Markdown, which requires the Python-markdown library from 
    99      http://www.freewisdom.org/projects/python-markdown 
    10        
     10 
    1111    * ReStructuredText, which requires docutils from http://docutils.sf.net/ 
    12      
     12 
    1313In each case, if the required library is not installed, the filter will 
    1414silently fail and return the un-marked-up text. 
     
    1717from django.core import template 
    1818 
    19 def textile(value, _): 
     19register = template.Library() 
     20 
     21def textile(value): 
    2022    try: 
    2123        import textile 
     
    2426    else: 
    2527        return textile.textile(value) 
    26          
    27 def markdown(value, _): 
     28 
     29def markdown(value): 
    2830    try: 
    2931        import markdown 
     
    3234    else: 
    3335        return markdown.markdown(value) 
    34          
    35 def restructuredtext(value, _): 
     36 
     37def restructuredtext(value): 
    3638    try: 
    3739        from docutils.core import publish_parts 
     
    4143        parts = publish_parts(source=value, writer_name="html4css1") 
    4244        return parts["fragment"] 
    43          
    44 template.register_filter("textile", textile, False) 
    45 template.register_filter("markdown", markdown, False
    46 template.register_filter("restructuredtext", restructuredtext, False
     45 
     46register.filter(textile) 
     47register.filter(markdown
     48register.filter(restructuredtext
  • django/trunk/django/core/template/defaultfilters.py

    r1050 r1443  
    11"Default variable filters" 
    22 
    3 from django.core.template import register_filter, resolve_variable 
     3from django.core.template import resolve_variable, Library 
     4from django.conf.settings import DATE_FORMAT, TIME_FORMAT 
    45import re 
    56import random as random_module 
    67 
     8register = Library() 
     9 
    710################### 
    811# STRINGS         # 
    912################### 
    1013 
    11 def addslashes(value, _): 
     14 
     15def addslashes(value): 
    1216    "Adds slashes - useful for passing strings to JavaScript, for example." 
    1317    return value.replace('"', '\\"').replace("'", "\\'") 
    1418 
    15 def capfirst(value, _): 
     19def capfirst(value): 
    1620    "Capitalizes the first character of the value" 
    1721    value = str(value) 
    1822    return value and value[0].upper() + value[1:] 
    1923 
    20 def fix_ampersands(value, _): 
     24def fix_ampersands(value): 
    2125    "Replaces ampersands with ``&amp;`` entities" 
    2226    from django.utils.html import fix_ampersands 
    2327    return fix_ampersands(value) 
    2428 
    25 def floatformat(text, _): 
     29def floatformat(text): 
    2630    """ 
    2731    Displays a floating point number as 34.2 (with one decimal place) -- but 
     
    3842        return '%d' % int(f) 
    3943 
    40 def linenumbers(value, _): 
     44def linenumbers(value): 
    4145    "Displays text with line numbers" 
    4246    from django.utils.html import escape 
     
    4852    return '\n'.join(lines) 
    4953 
    50 def lower(value, _): 
     54def lower(value): 
    5155    "Converts a string into all lowercase" 
    5256    return value.lower() 
    5357 
    54 def make_list(value, _): 
     58def make_list(value): 
    5559    """ 
    5660    Returns the value turned into a list. For an integer, it's a list of 
     
    5963    return list(str(value)) 
    6064 
    61 def slugify(value, _): 
     65def slugify(value): 
    6266    "Converts to lowercase, removes non-alpha chars and converts spaces to hyphens" 
    6367    value = re.sub('[^\w\s-]', '', value).strip().lower() 
     
    7882        return "" 
    7983 
    80 def title(value, _): 
     84def title(value): 
    8185    "Converts a string into titlecase" 
    8286    return re.sub("([a-z])'([A-Z])", lambda m: m.group(0).lower(), value.title()) 
     
    97101    return truncate_words(value, length) 
    98102 
    99 def upper(value, _): 
     103def upper(value): 
    100104    "Converts a string into all uppercase" 
    101105    return value.upper() 
    102106 
    103 def urlencode(value, _): 
     107def urlencode(value): 
    104108    "Escapes a value for use in a URL" 
    105109    import urllib 
    106110    return urllib.quote(value) 
    107111 
    108 def urlize(value, _): 
     112def urlize(value): 
    109113    "Converts URLs in plain text into clickable links" 
    110114    from django.utils.html import urlize 
     
    120124    return urlize(value, trim_url_limit=int(limit), nofollow=True) 
    121125 
    122 def wordcount(value, _): 
     126def wordcount(value): 
    123127    "Returns the number of words" 
    124128    return len(value.split()) 
     
    161165################### 
    162166 
    163 def escape(value, _): 
     167def escape(value): 
    164168    "Escapes a string's HTML" 
    165169    from django.utils.html import escape 
    166170    return escape(value) 
    167171 
    168 def linebreaks(value, _): 
     172def linebreaks(value): 
    169173    "Converts newlines into <p> and <br />s" 
    170174    from django.utils.html import linebreaks 
    171175    return linebreaks(value) 
    172176 
    173 def linebreaksbr(value, _): 
     177def linebreaksbr(value): 
    174178    "Converts newlines into <br />s" 
    175179    return value.replace('\n', '<br />') 
     
    185189    return value 
    186190 
    187 def striptags(value, _): 
     191def striptags(value): 
    188192    "Strips all [X]HTML tags" 
    189193    from django.utils.html import strip_tags 
     
    215219    return [item[1] for item in decorated] 
    216220 
    217 def first(value, _): 
     221def first(value): 
    218222    "Returns the first item in a list" 
    219223    try: 
     
    229233        return value 
    230234 
    231 def length(value, _): 
     235def length(value): 
    232236    "Returns the length of the value - useful for lists" 
    233237    return len(value) 
     
    237241    return len(value) == int(arg) 
    238242 
    239 def random(value, _): 
     243def random(value): 
    240244    "Returns a random item from the list" 
    241245    return random_module.choice(value) 
     
    254258        return value # Fail silently. 
    255259 
    256 def unordered_list(value, _): 
     260def unordered_list(value): 
    257261    """ 
    258262    Recursively takes a self-nested list and returns an HTML unordered list -- 
     
    315319################### 
    316320 
    317 def date(value, arg): 
     321def date(value, arg=DATE_FORMAT): 
    318322    "Formats a date according to the given format" 
    319323    from django.utils.dateformat import format 
    320324    return format(value, arg) 
    321325 
    322 def time(value, arg): 
     326def time(value, arg=TIME_FORMAT): 
    323327    "Formats a time according to the given format" 
    324328    from django.utils.dateformat import time_format 
    325329    return time_format(value, arg) 
    326330 
    327 def timesince(value, _): 
     331def timesince(value): 
    328332    'Formats a date as the time since that date (i.e. "4 days, 6 hours")' 
    329333    from django.utils.timesince import timesince 
     
    348352    return int(value) % int(arg) == 0 
    349353 
    350 def yesno(value, arg): 
     354def yesno(value, arg=_("yes,no,maybe")): 
    351355    """ 
    352356    Given a string mapping values for true, false and (optionally) None, 
     
    380384################### 
    381385 
    382 def filesizeformat(bytes, _): 
     386def filesizeformat(bytes): 
    383387    """ 
    384388    Format the value like a 'human-readable' file size (i.e. 13 KB, 4.1 MB, 102 
     
    394398    return "%.1f GB" % (bytes / (1024 * 1024 * 1024)) 
    395399 
    396 def pluralize(value, _): 
     400def pluralize(value): 
    397401    "Returns 's' if the value is not 1, for '1 vote' vs. '2 votes'" 
    398402    try: 
     
    409413    return '' 
    410414 
    411 def phone2numeric(value, _): 
     415def phone2numeric(value): 
    412416    "Takes a phone number and converts it in to its numerical equivalent" 
    413417    from django.utils.text import phone2numeric 
    414418    return phone2numeric(value) 
    415419 
    416 def pprint(value, _): 
     420def pprint(value): 
    417421    "A wrapper around pprint.pprint -- for debugging, really" 
    418422    from pprint import pformat 
    419423    return pformat(value) 
    420424 
    421 # Syntax: register_filter(name of filter, callback, has_argument
    422 register_filter('add', add, True
    423 register_filter('addslashes', addslashes, False
    424 register_filter('capfirst', capfirst, False
    425 register_filter('center', center, True
    426 register_filter('cut', cut, True
    427 register_filter('date', date, True) 
    428 register_filter('default', default, True
    429 register_filter('default_if_none', default_if_none, True) 
    430 register_filter('dictsort', dictsort, True
    431 register_filter('dictsortreversed', dictsortreversed, True
    432 register_filter('divisibleby', divisibleby, True
    433 register_filter('escape', escape, False) 
    434 register_filter('filesizeformat', filesizeformat, False
    435 register_filter('first', first, False
    436 register_filter('fix_ampersands', fix_ampersands, False
    437 register_filter('floatformat', floatformat, False
    438 register_filter('get_digit', get_digit, True
    439 register_filter('join', join, True
    440 register_filter('length', length, False
    441 register_filter('length_is', length_is, True
    442 register_filter('linebreaks', linebreaks, False
    443 register_filter('linebreaksbr', linebreaksbr, False
    444 register_filter('linenumbers', linenumbers, False
    445 register_filter('ljust', ljust, True
    446 register_filter('lower', lower, False
    447 register_filter('make_list', make_list, False
    448 register_filter('phone2numeric', phone2numeric, False
    449 register_filter('pluralize', pluralize, False) 
    450 register_filter('pprint', pprint, False
    451 register_filter('removetags', removetags, True
    452 register_filter('random', random, False
    453 register_filter('rjust', rjust, True
    454 register_filter('slice', slice_, True
    455 register_filter('slugify', slugify, False
    456 register_filter('stringformat', stringformat, True
    457 register_filter('striptags', striptags, False
    458 register_filter('time', time, True) 
    459 register_filter('timesince', timesince, False) 
    460 register_filter('title', title, False) 
    461 register_filter('truncatewords', truncatewords, True
    462 register_filter('unordered_list', unordered_list, False
    463 register_filter('upper', upper, False
    464 register_filter('urlencode', urlencode, False) 
    465 register_filter('urlize', urlize, False) 
    466 register_filter('urlizetrunc', urlizetrunc, True
    467 register_filter('wordcount', wordcount, False
    468 register_filter('wordwrap', wordwrap, True
    469 register_filter('yesno', yesno, True
     425# Syntax: register.filter(name of filter, callback
     426register.filter(add
     427register.filter(addslashes
     428register.filter(capfirst
     429register.filter(center
     430register.filter(cut
     431register.filter(date) 
     432register.filter(default
     433register.filter(default_if_none) 
     434register.filter(dictsort
     435register.filter(dictsortreversed
     436register.filter(divisibleby
     437register.filter(escape) 
     438register.filter(filesizeformat
     439register.filter(first
     440register.filter(fix_ampersands
     441register.filter(floatformat
     442register.filter(get_digit
     443register.filter(join
     444register.filter(length
     445register.filter(length_is
     446register.filter(linebreaks
     447register.filter(linebreaksbr
     448register.filter(linenumbers
     449register.filter(ljust
     450register.filter(lower
     451register.filter(make_list
     452register.filter(phone2numeric
     453register.filter(pluralize) 
     454register.filter(pprint
     455register.filter(removetags
     456register.filter(random
     457register.filter(rjust
     458register.filter(slice_
     459register.filter(slugify
     460register.filter(stringformat
     461register.filter(striptags
     462register.filter(time) 
     463register.filter(timesince) 
     464register.filter(title) 
     465register.filter(truncatewords
     466register.filter(unordered_list
     467register.filter(upper
     468register.filter(urlencode) 
     469register.filter(urlize) 
     470register.filter(urlizetrunc
     471register.filter(wordcount
     472register.filter(wordwrap
     473register.filter(yesno
  • django/trunk/django/core/template/defaulttags.py

    r1379 r1443  
    11"Default tags used by the template system, available to all templates." 
    22 
    3 from django.core.template import Node, NodeList, Template, Context, resolve_variable, resolve_variable_with_filters, get_filters_from_token, registered_filters 
    4 from django.core.template import TemplateSyntaxError, VariableDoesNotExist, BLOCK_TAG_START, BLOCK_TAG_END, VARIABLE_TAG_START, VARIABLE_TAG_END, register_tag 
     3from django.core.template import Node, NodeList, Template, Context, resolve_variable 
     4from django.core.template import TemplateSyntaxError, VariableDoesNotExist, BLOCK_TAG_START, BLOCK_TAG_END, VARIABLE_TAG_START, VARIABLE_TAG_END 
     5from django.core.template import get_library, Library, InvalidTemplateLibrary 
    56import sys 
     7 
     8register = Library() 
    69 
    710class CommentNode(Node): 
     
    2831 
    2932class FilterNode(Node): 
    30     def __init__(self, filters, nodelist): 
    31         self.filters, self.nodelist = filters, nodelist 
     33    def __init__(self, filter_expr, nodelist): 
     34        self.filter_expr, self.nodelist = filter_expr, nodelist 
    3235 
    3336    def render(self, context): 
    3437        output = self.nodelist.render(context) 
    3538        # apply filters 
    36         for f in self.filters: 
    37             output = registered_filters[f[0]][0](output, f[1]) 
    38         return output 
     39        return self.filter_expr.resolve(Context({'var': output})) 
    3940 
    4041class FirstOfNode(Node): 
     
    8283        context.push() 
    8384        try: 
    84             values = resolve_variable_with_filters(self.sequence, context) 
     85            values = self.sequence.resolve(context) 
    8586        except VariableDoesNotExist: 
    8687            values = [] 
     
    148149 
    149150class IfNode(Node): 
    150     def __init__(self, boolvars, nodelist_true, nodelist_false): 
    151         self.boolvars = boolvars 
     151    def __init__(self, bool_exprs, nodelist_true, nodelist_false): 
     152        self.bool_exprs = bool_exprs 
    152153        self.nodelist_true, self.nodelist_false = nodelist_true, nodelist_false 
    153154 
     
    170171 
    171172    def render(self, context): 
    172         for ifnot, boolvar in self.boolvars: 
     173        for ifnot, bool_expr in self.bool_exprs: 
    173174            try: 
    174                 value = resolve_variable_with_filters(boolvar, context) 
     175                value = bool_expr.resolve(context) 
    175176            except VariableDoesNotExist: 
    176177                value = None 
     
    180181 
    181182class RegroupNode(Node): 
    182     def __init__(self, target_var, expression, var_name): 
    183         self.target_var, self.expression = target_var, expression 
     183    def __init__(self, target, expression, var_name): 
     184        self.target, self.expression = target, expression 
    184185        self.var_name = var_name 
    185186 
    186187    def render(self, context): 
    187         obj_list = resolve_variable_with_filters(self.target_var, context) 
     188        obj_list = self.target.resolve(context) 
    188189        if obj_list == '': # target_var wasn't found in context; fail silently 
    189190            context[self.var_name] = [] 
     
    191192        output = [] # list of dictionaries in the format {'grouper': 'key', 'list': [list of contents]} 
    192193        for obj in obj_list: 
    193             grouper = resolve_variable_with_filters('var.%s' % self.expression, \ 
    194                 Context({'var': obj})) 
     194            grouper = self.expression.resolve(Context({'var': obj})) 
    195195            # TODO: Is this a sensible way to determine equality? 
    196196            if output and repr