Changeset 1443
- Timestamp:
- 11/26/05 16:46:31 (2 years ago)
- Files:
-
- django/trunk/django/contrib/admin/templates/admin/change_form.html (modified) (1 diff)
- django/trunk/django/contrib/admin/templates/admin/change_list.html (modified) (1 diff)
- django/trunk/django/contrib/admin/templates/admin/edit_inline_stacked.html (modified) (1 diff)
- django/trunk/django/contrib/admin/templates/admin/edit_inline_tabular.html (modified) (1 diff)
- django/trunk/django/contrib/admin/templates/admin/field_line.html (modified) (1 diff)
- django/trunk/django/contrib/admin/templates/admin/filter.html (modified) (1 diff)
- django/trunk/django/contrib/admin/templates/admin/filters.html (modified) (1 diff)
- django/trunk/django/contrib/admin/templates/admin/pagination.html (modified) (1 diff)
- django/trunk/django/contrib/admin/templates/admin/search_form.html (modified) (1 diff)
- django/trunk/django/contrib/admin/templates/widget/default.html (modified) (1 diff)
- django/trunk/django/contrib/admin/templates/widget/file.html (modified) (1 diff)
- django/trunk/django/contrib/admin/templates/widget/foreign.html (modified) (2 diffs)
- django/trunk/django/contrib/admin/templatetags/adminapplist.py (modified) (2 diffs)
- django/trunk/django/contrib/admin/templatetags/admin_list.py (modified) (8 diffs)
- django/trunk/django/contrib/admin/templatetags/adminmedia.py (modified) (2 diffs)
- django/trunk/django/contrib/admin/templatetags/admin_modify.py (modified) (11 diffs)
- django/trunk/django/contrib/admin/templatetags/log.py (modified) (2 diffs)
- django/trunk/django/contrib/admin/views/template.py (modified) (2 diffs)
- django/trunk/django/contrib/comments/templatetags/comments.py (modified) (2 diffs)
- django/trunk/django/contrib/markup/templatetags/markup.py (modified) (5 diffs)
- django/trunk/django/core/template/decorators.py (deleted)
- django/trunk/django/core/template/defaultfilters.py (modified) (18 diffs)
- django/trunk/django/core/template/defaulttags.py (modified) (26 diffs)
- django/trunk/django/core/template/__init__.py (modified) (20 diffs)
- django/trunk/django/core/template/loader.py (modified) (3 diffs)
- django/trunk/django/core/template/loader_tags.py (added)
- django/trunk/django/templatetags/i18n.py (modified) (4 diffs)
- django/trunk/docs/templates_python.txt (modified) (5 diffs)
- django/trunk/docs/templates.txt (modified) (1 diff)
- django/trunk/tests/othertests/defaultfilters.py (modified) (1 diff)
- django/trunk/tests/othertests/markup.py (modified) (3 diffs)
- django/trunk/tests/othertests/templates.py (modified) (3 diffs)
- django/trunk/tests/testapp/templatetags/testtags.py (modified) (2 diffs)
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
django/trunk/django/contrib/admin/templates/admin/change_form.html
r1434 r1443 1 1 {% extends "admin/base_site" %} 2 {% load i18n %} 3 {% load admin_modify %} 4 {% load adminmedia %} 2 {% load i18n admin_modify adminmedia %} 5 3 {% block extrahead %} 6 4 {% 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 %} 3 2 {% extends "admin/base_site" %} 4 3 {% block bodyclass %}change-list{% endblock %} django/trunk/django/contrib/admin/templates/admin/edit_inline_stacked.html
r1434 r1443 1 {% load admin_modify %} 1 2 <fieldset class="module aligned"> 2 3 {% 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 %} 1 2 <fieldset class="module"> 2 3 <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 %} 1 2 <div class="{{ class_names }}" > 2 3 {% 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 %} 1 2 <h3>{% blocktrans %} By {{ title }} {% endblocktrans %}</h3> 2 3 <ul> django/trunk/django/contrib/admin/templates/admin/filters.html
r1434 r1443 1 {% load admin_list %} 1 2 {% if cl.has_filters %}<div id="changelist-filter"> 2 3 <h2>Filter</h2> django/trunk/django/contrib/admin/templates/admin/pagination.html
r1434 r1443 1 {% load admin_list %} 1 2 <p class="paginator"> 2 3 {% if pagination_required %} django/trunk/django/contrib/admin/templates/admin/search_form.html
r1434 r1443 1 {% load adminmedia %} 1 2 {% if cl.lookup_opts.admin.search_fields %} 2 3 <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 %} 2 2 Currently: <a href="{{ bound_field.original_url }}" > {{ bound_field.original_value }} </a><br /> 3 3 Change: {% output_all bound_field.form_fields %} django/trunk/django/contrib/admin/templates/widget/foreign.html
r1434 r1443 1 {% load admin_modify adminmedia %} 1 2 {% output_all bound_field.form_fields %} 2 3 {% if bound_field.raw_id_admin %} … … 5 6 {% if bound_field.needs_add_label %} 6 7 <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 1 1 from django.core import template 2 3 register = template.Library() 2 4 3 5 class AdminApplistNode(template.Node): … … 55 57 return AdminApplistNode(tokens[2]) 56 58 57 template.register_tag('get_admin_app_list', get_admin_app_list)59 register.tag('get_admin_app_list', get_admin_app_list) django/trunk/django/contrib/admin/templatetags/admin_list.py
r1434 r1443 4 4 from django.core import meta, template 5 5 from django.core.exceptions import ObjectDoesNotExist 6 from django.core.template.decorators import simple_tag, inclusion_tag7 6 from django.utils import dateformat 8 7 from django.utils.html import strip_tags, escape … … 10 9 from django.utils.translation import get_date_formats 11 10 from django.conf.settings import ADMIN_MEDIA_PREFIX 11 from django.core.template import Library 12 13 register = Library() 12 14 13 15 DOT = '.' 14 16 15 #@ simple_tag17 #@register.simple_tag 16 18 def paginator_number(cl,i): 17 19 if i == DOT: … … 21 23 else: 22 24 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')25 paginator_number = register.simple_tag(paginator_number) 26 27 #@register.inclusion_tag('admin/pagination') 26 28 def pagination(cl): 27 29 paginator, page_num = cl.paginator, cl.page_num … … 65 67 '1': 1, 66 68 } 67 pagination = inclusion_tag('admin/pagination')(pagination)69 pagination = register.inclusion_tag('admin/pagination')(pagination) 68 70 69 71 def result_headers(cl): … … 178 180 yield list(items_for_result(cl,res)) 179 181 180 #@ inclusion_tag("admin/change_list_results")182 #@register.inclusion_tag("admin/change_list_results") 181 183 def result_list(cl): 182 184 res = list(results(cl)) … … 184 186 'result_headers': list(result_headers(cl)), 185 187 'results': list(results(cl))} 186 result_list = inclusion_tag("admin/change_list_results")(result_list)187 188 #@ inclusion_tag("admin/date_hierarchy")188 result_list = register.inclusion_tag("admin/change_list_results")(result_list) 189 190 #@register.inclusion_tag("admin/date_hierarchy") 189 191 def date_hierarchy(cl): 190 192 lookup_opts, params, lookup_params, lookup_mod = \ … … 257 259 } for year in years ] 258 260 } 259 date_hierarchy = inclusion_tag('admin/date_hierarchy')(date_hierarchy)260 261 #@ inclusion_tag('admin/search_form')261 date_hierarchy = register.inclusion_tag('admin/date_hierarchy')(date_hierarchy) 262 263 #@register.inclusion_tag('admin/search_form') 262 264 def search_form(cl): 263 265 return { … … 266 268 'search_var': SEARCH_VAR 267 269 } 268 search_form = inclusion_tag('admin/search_form')(search_form)269 270 #@ inclusion_tag('admin/filter')270 search_form = register.inclusion_tag('admin/search_form')(search_form) 271 272 #@register.inclusion_tag('admin/filter') 271 273 def filter(cl, spec): 272 274 return {'title': spec.title(), 'choices' : list(spec.choices(cl))} 273 filter = inclusion_tag('admin/filter')(filter)274 275 #@ inclusion_tag('admin/filters')275 filter = register.inclusion_tag('admin/filter')(filter) 276 277 #@register.inclusion_tag('admin/filters') 276 278 def filters(cl): 277 279 return {'cl': cl} 278 filters = inclusion_tag('admin/filters')(filters)280 filters = 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 1 from django.core.template import Library 2 register = Library() 2 3 3 4 def admin_media_prefix(): … … 7 8 return '' 8 9 return ADMIN_MEDIA_PREFIX 9 admin_media_prefix = simple_tag(admin_media_prefix)10 admin_media_prefix = register.simple_tag(admin_media_prefix) django/trunk/django/contrib/admin/templatetags/admin_modify.py
r1434 r1443 3 3 from django.utils.text import capfirst 4 4 from django.utils.functional import curry 5 from django.core.template.decorators import simple_tag, inclusion_tag6 5 from django.contrib.admin.views.main import AdminBoundField 7 6 from django.core.meta.fields import BoundField, Field … … 10 9 import re 11 10 11 register = template.Library() 12 12 13 word_re = re.compile('[A-Z][a-z]+') 13 14 … … 15 16 return '_'.join([s.lower() for s in word_re.findall(name)[:-1]]) 16 17 17 #@ simple_tag18 #@register.simple_tag 18 19 def include_admin_script(script_path): 19 20 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)21 include_admin_script = register.simple_tag(include_admin_script) 22 23 #@register.inclusion_tag('admin/submit_line', takes_context=True) 23 24 def submit_row(context, bound_manipulator): 24 25 change = context['change'] … … 37 38 'show_save': True 38 39 } 39 submit_row = inclusion_tag('admin/submit_line', takes_context=True)(submit_row)40 41 #@ simple_tag40 submit_row = register.inclusion_tag('admin/submit_line', takes_context=True)(submit_row) 41 42 #@register.simple_tag 42 43 def field_label(bound_field): 43 44 class_names = [] … … 54 55 return '<label for="%s"%s>%s%s</label> ' % (bound_field.element_id, class_str, \ 55 56 capfirst(bound_field.field.verbose_name), colon) 56 field_label = simple_tag(field_label)57 field_label = register.simple_tag(field_label) 57 58 58 59 class FieldWidgetNode(template.Node): … … 171 172 return output 172 173 173 #@ simple_tag174 #@register.simple_tag 174 175 def output_all(form_fields): 175 176 return ''.join([str(f) for f in form_fields]) 176 output_all = simple_tag(output_all)177 178 #@ simple_tag177 output_all = register.simple_tag(output_all) 178 179 #@register.simple_tag 179 180 def auto_populated_field_script(auto_pop_fields, change = False): 180 181 for field in auto_pop_fields: … … 192 193 f, field.name, add_values, field.maxlength)) 193 194 return ''.join(t) 194 auto_populated_field_script = simple_tag(auto_populated_field_script)195 196 #@ simple_tag195 auto_populated_field_script = register.simple_tag(auto_populated_field_script) 196 197 #@register.simple_tag 197 198 def filter_interface_script_maybe(bound_field): 198 199 f = bound_field.field … … 203 204 else: 204 205 return '' 205 filter_interface_script_maybe = simple_tag(filter_interface_script_maybe)206 filter_interface_script_maybe = register.simple_tag(filter_interface_script_maybe) 206 207 207 208 def do_one_arg_tag(node_factory, parser,token): … … 214 215 tag_name = class_name_to_underscored(node.__name__) 215 216 parse_func = curry(do_one_arg_tag, node) 216 template.register_tag(tag_name, parse_func)217 register.tag(tag_name, parse_func) 217 218 218 219 one_arg_tag_nodes = ( … … 224 225 register_one_arg_tag(node) 225 226 226 #@ inclusion_tag('admin/field_line', takes_context=True)227 #@register.inclusion_tag('admin/field_line', takes_context=True) 227 228 def admin_field_line(context, argument_val): 228 229 if (isinstance(argument_val, BoundField)): … … 250 251 'class_names': " ".join(class_names), 251 252 } 252 admin_field_line = inclusion_tag('admin/field_line', takes_context=True)(admin_field_line)253 254 #@ simple_tag253 admin_field_line = register.inclusion_tag('admin/field_line', takes_context=True)(admin_field_line) 254 255 #@register.simple_tag 255 256 def object_pk(bound_manip, ordered_obj): 256 257 return bound_manip.get_ordered_object_pk(ordered_obj) 257 258 258 object_pk = simple_tag(object_pk)259 object_pk = register.simple_tag(object_pk) django/trunk/django/contrib/admin/templatetags/log.py
r948 r1443 1 1 from django.models.admin import log 2 2 from django.core import template 3 4 register = template.Library() 3 5 4 6 class AdminLogNode(template.Node): … … 49 51 return AdminLogNode(limit=tokens[1], varname=tokens[3], user=(len(tokens) > 5 and tokens[5] or None)) 50 52 51 template.register_tag('get_admin_log', DoGetAdminLog('get_admin_log'))53 register.tag('get_admin_log', DoGetAdminLog('get_admin_log')) django/trunk/django/contrib/admin/views/template.py
r948 r1443 51 51 52 52 # so that inheritance works in the site's context, register a new function 53 # for "extends" that uses the site's TEMPLATE_DIR instead53 # for "extends" that uses the site's TEMPLATE_DIRS instead. 54 54 def new_do_extends(parser, token): 55 55 node = loader.do_extends(parser, token) 56 56 node.template_dirs = settings_module.TEMPLATE_DIRS 57 57 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) 59 61 60 # now validate the template using the new template dirs61 # 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. 62 64 error = None 63 65 try: … … 66 68 except template.TemplateSyntaxError, e: 67 69 error = e 68 template. register_tag('extends', loader.do_extends)70 template.builtins.remove(register) 69 71 if error: 70 72 raise validators.ValidationError, e.args django/trunk/django/contrib/comments/templatetags/comments.py
r1378 r1443 6 6 from django.models.core import contenttypes 7 7 import re 8 9 register = template.Library() 8 10 9 11 COMMENT_FORM = ''' … … 361 363 362 364 # 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))365 register.tag('get_comment_list', DoGetCommentList(False)) 366 register.tag('comment_form', DoCommentForm(False)) 367 register.tag('get_comment_count', DoCommentCount(False)) 366 368 # 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))369 register.tag('get_free_comment_list', DoGetCommentList(True)) 370 register.tag('free_comment_form', DoCommentForm(True)) 371 register.tag('get_free_comment_count', DoCommentCount(True)) django/trunk/django/contrib/markup/templatetags/markup.py
r467 r1443 5 5 * Textile, which requires the PyTextile library available at 6 6 http://dealmeida.net/projects/textile/ 7 7 8 8 * Markdown, which requires the Python-markdown library from 9 9 http://www.freewisdom.org/projects/python-markdown 10 10 11 11 * ReStructuredText, which requires docutils from http://docutils.sf.net/ 12 12 13 13 In each case, if the required library is not installed, the filter will 14 14 silently fail and return the un-marked-up text. … … 17 17 from django.core import template 18 18 19 def textile(value, _): 19 register = template.Library() 20 21 def textile(value): 20 22 try: 21 23 import textile … … 24 26 else: 25 27 return textile.textile(value) 26 27 def markdown(value , _):28 29 def markdown(value): 28 30 try: 29 31 import markdown … … 32 34 else: 33 35 return markdown.markdown(value) 34 35 def restructuredtext(value , _):36 37 def restructuredtext(value): 36 38 try: 37 39 from docutils.core import publish_parts … … 41 43 parts = publish_parts(source=value, writer_name="html4css1") 42 44 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 46 register.filter(textile) 47 register.filter(markdown) 48 register.filter(restructuredtext) django/trunk/django/core/template/defaultfilters.py
r1050 r1443 1 1 "Default variable filters" 2 2 3 from django.core.template import register_filter, resolve_variable 3 from django.core.template import resolve_variable, Library 4 from django.conf.settings import DATE_FORMAT, TIME_FORMAT 4 5 import re 5 6 import random as random_module 6 7 8 register = Library() 9 7 10 ################### 8 11 # STRINGS # 9 12 ################### 10 13 11 def addslashes(value, _): 14 15 def addslashes(value): 12 16 "Adds slashes - useful for passing strings to JavaScript, for example." 13 17 return value.replace('"', '\\"').replace("'", "\\'") 14 18 15 def capfirst(value , _):19 def capfirst(value): 16 20 "Capitalizes the first character of the value" 17 21 value = str(value) 18 22 return value and value[0].upper() + value[1:] 19 23 20 def fix_ampersands(value , _):24 def fix_ampersands(value): 21 25 "Replaces ampersands with ``&`` entities" 22 26 from django.utils.html import fix_ampersands 23 27 return fix_ampersands(value) 24 28 25 def floatformat(text , _):29 def floatformat(text): 26 30 """ 27 31 Displays a floating point number as 34.2 (with one decimal place) -- but … … 38 42 return '%d' % int(f) 39 43 40 def linenumbers(value , _):44 def linenumbers(value): 41 45 "Displays text with line numbers" 42 46 from django.utils.html import escape … … 48 52 return '\n'.join(lines) 49 53 50 def lower(value , _):54 def lower(value): 51 55 "Converts a string into all lowercase" 52 56 return value.lower() 53 57 54 def make_list(value , _):58 def make_list(value): 55 59 """ 56 60 Returns the value turned into a list. For an integer, it's a list of … … 59 63 return list(str(value)) 60 64 61 def slugify(value , _):65 def slugify(value): 62 66 "Converts to lowercase, removes non-alpha chars and converts spaces to hyphens" 63 67 value = re.sub('[^\w\s-]', '', value).strip().lower() … … 78 82 return "" 79 83 80 def title(value , _):84 def title(value): 81 85 "Converts a string into titlecase" 82 86 return re.sub("([a-z])'([A-Z])", lambda m: m.group(0).lower(), value.title()) … … 97 101 return truncate_words(value, length) 98 102 99 def upper(value , _):103 def upper(value): 100 104 "Converts a string into all uppercase" 101 105 return value.upper() 102 106 103 def urlencode(value , _):107 def urlencode(value): 104 108 "Escapes a value for use in a URL" 105 109 import urllib 106 110 return urllib.quote(value) 107 111 108 def urlize(value , _):112 def urlize(value): 109 113 "Converts URLs in plain text into clickable links" 110 114 from django.utils.html import urlize … … 120 124 return urlize(value, trim_url_limit=int(limit), nofollow=True) 121 125 122 def wordcount(value , _):126 def wordcount(value): 123 127 "Returns the number of words" 124 128 return len(value.split()) … … 161 165 ################### 162 166 163 def escape(value , _):167 def escape(value): 164 168 "Escapes a string's HTML" 165 169 from django.utils.html import escape 166 170 return escape(value) 167 171 168 def linebreaks(value , _):172 def linebreaks(value): 169 173 "Converts newlines into <p> and <br />s" 170 174 from django.utils.html import linebreaks 171 175 return linebreaks(value) 172 176 173 def linebreaksbr(value , _):177 def linebreaksbr(value): 174 178 "Converts newlines into <br />s" 175 179 return value.replace('\n', '<br />') … … 185 189 return value 186 190 187 def striptags(value , _):191 def striptags(value): 188 192 "Strips all [X]HTML tags" 189 193 from django.utils.html import strip_tags … … 215 219 return [item[1] for item in decorated] 216 220 217 def first(value , _):221 def first(value): 218 222 "Returns the first item in a list" 219 223 try: … … 229 233 return value 230 234 231 def length(value , _):235 def length(value): 232 236 "Returns the length of the value - useful for lists" 233 237 return len(value) … … 237 241 return len(value) == int(arg) 238 242 239 def random(value , _):243 def random(value): 240 244 "Returns a random item from the list" 241 245 return random_module.choice(value) … … 254 258 return value # Fail silently. 255 259 256 def unordered_list(value , _):260 def unordered_list(value): 257 261 """ 258 262 Recursively takes a self-nested list and returns an HTML unordered list -- … … 315 319 ################### 316 320 317 def date(value, arg ):321 def date(value, arg=DATE_FORMAT): 318 322 "Formats a date according to the given format" 319 323 from django.utils.dateformat import format 320 324 return format(value, arg) 321 325 322 def time(value, arg ):326 def time(value, arg=TIME_FORMAT): 323 327 "Formats a time according to the given format" 324 328 from django.utils.dateformat import time_format 325 329 return time_format(value, arg) 326 330 327 def timesince(value , _):331 def timesince(value): 328 332 'Formats a date as the time since that date (i.e. "4 days, 6 hours")' 329 333 from django.utils.timesince import timesince … … 348 352 return int(value) % int(arg) == 0 349 353 350 def yesno(value, arg ):354 def yesno(value, arg=_("yes,no,maybe")): 351 355 """ 352 356 Given a string mapping values for true, false and (optionally) None, … … 380 384 ################### 381 385 382 def filesizeformat(bytes , _):386 def filesizeformat(bytes): 383 387 """ 384 388 Format the value like a 'human-readable' file size (i.e. 13 KB, 4.1 MB, 102 … … 394 398 return "%.1f GB" % (bytes / (1024 * 1024 * 1024)) 395 399 396 def pluralize(value , _):400 def pluralize(value): 397 401 "Returns 's' if the value is not 1, for '1 vote' vs. '2 votes'" 398 402 try: … … 409 413 return '' 410 414 411 def phone2numeric(value , _):415 def phone2numeric(value): 412 416 "Takes a phone number and converts it in to its numerical equivalent" 413 417 from django.utils.text import phone2numeric 414 418 return phone2numeric(value) 415 419 416 def pprint(value , _):420 def pprint(value): 417 421 "A wrapper around pprint.pprint -- for debugging, really" 418 422 from pprint import pformat 419 423 return pformat(value) 420 424 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) 426 register.filter(add) 427 register.filter(addslashes) 428 register.filter(capfirst) 429 register.filter(center) 430 register.filter(cut) 431 register.filter(date) 432 register.filter(default) 433 register.filter(default_if_none) 434 register.filter(dictsort) 435 register.filter(dictsortreversed) 436 register.filter(divisibleby) 437 register.filter(escape) 438 register.filter(filesizeformat) 439 register.filter(first) 440 register.filter(fix_ampersands) 441 register.filter(floatformat) 442 register.filter(get_digit) 443 register.filter(join) 444 register.filter(length) 445 register.filter(length_is) 446 register.filter(linebreaks) 447 register.filter(linebreaksbr) 448 register.filter(linenumbers) 449 register.filter(ljust) 450 register.filter(lower) 451 register.filter(make_list) 452 register.filter(phone2numeric) 453 register.filter(pluralize) 454 register.filter(pprint) 455 register.filter(removetags) 456 register.filter(random) 457 register.filter(rjust) 458 register.filter(slice_) 459 register.filter(slugify) 460 register.filter(stringformat) 461 register.filter(striptags) 462 register.filter(time) 463 register.filter(timesince) 464 register.filter(title) 465 register.filter(truncatewords) 466 register.filter(unordered_list) 467 register.filter(upper) 468 register.filter(urlencode) 469 register.filter(urlize) 470 register.filter(urlizetrunc) 471 register.filter(wordcount) 472 register.filter(wordwrap) 473 register.filter(yesno) django/trunk/django/core/template/defaulttags.py
r1379 r1443 1 1 "Default tags used by the template system, available to all templates." 2 2 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 3 from django.core.template import Node, NodeList, Template, Context, resolve_variable 4 from django.core.template import TemplateSyntaxError, VariableDoesNotExist, BLOCK_TAG_START, BLOCK_TAG_END, VARIABLE_TAG_START, VARIABLE_TAG_END 5 from django.core.template import get_library, Library, InvalidTemplateLibrary 5 6 import sys 7 8 register = Library() 6 9 7 10 class CommentNode(Node): … … 28 31 29 32 class FilterNode(Node): 30 def __init__(self, filter s, nodelist):31 self.filter s, self.nodelist = filters, nodelist33 def __init__(self, filter_expr, nodelist): 34 self.filter_expr, self.nodelist = filter_expr, nodelist 32 35 33 36 def render(self, context): 34 37 output = self.nodelist.render(context) 35 38 # 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})) 39 40 40 41 class FirstOfNode(Node): … … 82 83 context.push() 83 84 try: 84 values = resolve_variable_with_filters(self.sequence,context)85 values = self.sequence.resolve(context) 85 86 except VariableDoesNotExist: 86 87 values = [] … … 148 149 149 150 class IfNode(Node): 150 def __init__(self, bool vars, nodelist_true, nodelist_false):151 self.bool vars = boolvars151 def __init__(self, bool_exprs, nodelist_true, nodelist_false): 152 self.bool_exprs = bool_exprs 152 153 self.nodelist_true, self.nodelist_false = nodelist_true, nodelist_false 153 154 … … 170 171 171 172 def render(self, context): 172 for ifnot, bool var in self.boolvars:173 for ifnot, bool_expr in self.bool_exprs: 173 174 try: 174 value = resolve_variable_with_filters(boolvar,context)175 value = bool_expr.resolve(context) 175 176 except VariableDoesNotExist: 176 177 value = None … … 180 181 181 182 class RegroupNode(Node): 182 def __init__(self, target _var, expression, var_name):183 self.target _var, self.expression = target_var, expression183 def __init__(self, target, expression, var_name): 184 self.target, self.expression = target, expression 184 185 self.var_name = var_name 185 186 186 187 def render(self, context): 187 obj_list = resolve_variable_with_filters(self.target_var,context)188 obj_list = self.target.resolve(context) 188 189 if obj_list == '': # target_var wasn't found in context; fail silently 189 190 context[self.var_name] = [] … … 191 192 output = [] # list of dictionaries in the format {'grouper': 'key', 'list': [list of contents]} 192 193 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})) 195 195 # TODO: Is this a sensible way to determine equality? 196 196 if output and repr
