Changeset 867
- Timestamp:
- 10/14/05 15:10:13 (3 years ago)
- Files:
-
- django/trunk/django/core/extensions.py (modified) (1 diff)
- django/trunk/django/core/rss.py (modified) (5 diffs)
- django/trunk/django/core/template (added)
- django/trunk/django/core/template/defaultfilters.py (moved) (moved from django/trunk/django/core/defaultfilters.py) (4 diffs)
- django/trunk/django/core/template/defaulttags.py (moved) (moved from django/trunk/django/core/defaulttags.py) (41 diffs)
- django/trunk/django/core/template/__init__.py (moved) (moved from django/trunk/django/core/template.py)
- django/trunk/django/core/template_loader.py (modified) (1 diff)
- django/trunk/django/core/template/loader.py (added)
- django/trunk/django/core/template/loaders (added)
- django/trunk/django/core/template/loaders/filesystem.py (moved) (moved from django/trunk/django/core/template_file.py) (1 diff)
- django/trunk/django/core/template/loaders/__init__.py (added)
- django/trunk/django/middleware/admin.py (modified) (2 diffs)
- django/trunk/django/views/admin/doc.py (modified) (1 diff)
- django/trunk/django/views/admin/template.py (modified) (3 diffs)
- django/trunk/django/views/auth/login.py (modified) (1 diff)
- django/trunk/django/views/defaults.py (modified) (3 diffs)
- django/trunk/django/views/registration/passwords.py (modified) (2 diffs)
- django/trunk/docs/forms.txt (modified) (6 diffs)
- django/trunk/docs/sessions.txt (modified) (1 diff)
- django/trunk/docs/templates_python.txt (modified) (3 diffs)
- django/trunk/docs/tutorial03.txt (modified) (4 diffs)
- django/trunk/docs/tutorial04.txt (modified) (1 diff)
- django/trunk/tests/othertests/templates.py (modified) (5 diffs)
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
django/trunk/django/core/extensions.py
r673 r867 3 3 # for convenience's sake. 4 4 5 from django.core import template_loader6 5 from django.core.exceptions import Http404, ObjectDoesNotExist 7 from django.core.template import Context 6 from django.core.template import Context, loader 8 7 from django.conf.settings import DEBUG, INTERNAL_IPS 9 8 from django.utils.httpwrappers import HttpResponse 10 9 11 10 def render_to_response(*args, **kwargs): 12 return HttpResponse( template_loader.render_to_string(*args, **kwargs))11 return HttpResponse(loader.render_to_string(*args, **kwargs)) 13 12 load_and_render = render_to_response # For backwards compatibility. 14 13 django/trunk/django/core/rss.py
r743 r867 1 from django.core import template_loader2 1 from django.core.exceptions import ObjectDoesNotExist 3 from django.core.template import Context 2 from django.core.template import Context, loader 4 3 from django.models.core import sites 5 4 from django.utils import feedgenerator … … 29 28 get_list_kwargs_cb -- Function that takes the param and returns a 30 29 dictionary to use in addition to get_list_kwargs (if applicable). 31 30 32 31 get_pubdate_cb -- Function that takes the object and returns a datetime 33 32 to use as the publication date in the feed. … … 50 49 self.enc_length = enc_length 51 50 self.enc_mime_type = enc_mime_type 52 51 53 52 def get_feed(self, param_slug=None): 54 53 """ … … 65 64 current_site = sites.get_current() 66 65 f = self._get_feed_generator_object(param) 67 title_template = template_loader.get_template('rss/%s_title' % self.slug)68 description_template = template_loader.get_template('rss/%s_description' % self.slug)66 title_template = loader.get_template('rss/%s_title' % self.slug) 67 description_template = loader.get_template('rss/%s_description' % self.slug) 69 68 kwargs = self.get_list_kwargs.copy() 70 69 if param and self.get_list_kwargs_cb: … … 103 102 ) 104 103 return f 105 104 106 105 def _get_feed_generator_object(self, param): 107 106 current_site = sites.get_current() django/trunk/django/core/template/defaultfilters.py
r859 r867 1 1 "Default variable filters" 2 2 3 import template, re 3 from django.core.template import register_filter, resolve_variable 4 import re 4 5 import random as random_module 5 6 … … 197 198 the argument. 198 199 """ 199 decorated = [( template.resolve_variable('var.' + arg, {'var' : item}), item) for item in value]200 decorated = [(resolve_variable('var.' + arg, {'var' : item}), item) for item in value] 200 201 decorated.sort() 201 202 return [item[1] for item in decorated] … … 206 207 property given in the argument. 207 208 """ 208 decorated = [( template.resolve_variable('var.' + arg, {'var' : item}), item) for item in value]209 decorated = [(resolve_variable('var.' + arg, {'var' : item}), item) for item in value] 209 210 decorated.sort() 210 211 decorated.reverse() … … 415 416 return pformat(value) 416 417 417 # Syntax: template.register_filter(name of filter, callback, has_argument)418 template.register_filter('add', add, True)419 template.register_filter('addslashes', addslashes, False)420 template.register_filter('capfirst', capfirst, False)421 template.register_filter('center', center, True)422 template.register_filter('cut', cut, True)423 template.register_filter('date', date, True)424 template.register_filter('default', default, True)425 template.register_filter('dictsort', dictsort, True)426 template.register_filter('dictsortreversed', dictsortreversed, True)427 template.register_filter('divisibleby', divisibleby, True)428 template.register_filter('escape', escape, False)429 template.register_filter('filesizeformat', filesizeformat, False)430 template.register_filter('first', first, False)431 template.register_filter('fix_ampersands', fix_ampersands, False)432 template.register_filter('floatformat', floatformat, False)433 template.register_filter('get_digit', get_digit, True)434 template.register_filter('join', join, True)435 template.register_filter('length', length, False)436 template.register_filter('length_is', length_is, True)437 template.register_filter('linebreaks', linebreaks, False)438 template.register_filter('linebreaksbr', linebreaksbr, False)439 template.register_filter('linenumbers', linenumbers, False)440 template.register_filter('ljust', ljust, True)441 template.register_filter('lower', lower, False)442 template.register_filter('make_list', make_list, False)443 template.register_filter('phone2numeric', phone2numeric, False)444 template.register_filter('pluralize', pluralize, False)445 template.register_filter('pprint', pprint, False)446 template.register_filter('removetags', removetags, True)447 template.register_filter('random', random, False)448 template.register_filter('rjust', rjust, True)449 template.register_filter('slice', slice_, True)450 template.register_filter('slugify', slugify, False)451 template.register_filter('stringformat', stringformat, True)452 template.register_filter('striptags', striptags, False)453 template.register_filter('time', time, True)454 template.register_filter('timesince', timesince, False)455 template.register_filter('title', title, False)456 template.register_filter('truncatewords', truncatewords, True)457 template.register_filter('unordered_list', unordered_list, False)458 template.register_filter('upper', upper, False)459 template.register_filter('urlencode', urlencode, False)460 template.register_filter('urlize', urlize, False)461 template.register_filter('urlizetrunc', urlizetrunc, True)462 template.register_filter('wordcount', wordcount, False)463 template.register_filter('wordwrap', wordwrap, True)464 template.register_filter('yesno', yesno, True)418 # Syntax: register_filter(name of filter, callback, has_argument) 419 register_filter('add', add, True) 420 register_filter('addslashes', addslashes, False) 421 register_filter('capfirst', capfirst, False) 422 register_filter('center', center, True) 423 register_filter('cut', cut, True) 424 register_filter('date', date, True) 425 register_filter('default', default, True) 426 register_filter('dictsort', dictsort, True) 427 register_filter('dictsortreversed', dictsortreversed, True) 428 register_filter('divisibleby', divisibleby, True) 429 register_filter('escape', escape, False) 430 register_filter('filesizeformat', filesizeformat, False) 431 register_filter('first', first, False) 432 register_filter('fix_ampersands', fix_ampersands, False) 433 register_filter('floatformat', floatformat, False) 434 register_filter('get_digit', get_digit, True) 435 register_filter('join', join, True) 436 register_filter('length', length, False) 437 register_filter('length_is', length_is, True) 438 register_filter('linebreaks', linebreaks, False) 439 register_filter('linebreaksbr', linebreaksbr, False) 440 register_filter('linenumbers', linenumbers, False) 441 register_filter('ljust', ljust, True) 442 register_filter('lower', lower, False) 443 register_filter('make_list', make_list, False) 444 register_filter('phone2numeric', phone2numeric, False) 445 register_filter('pluralize', pluralize, False) 446 register_filter('pprint', pprint, False) 447 register_filter('removetags', removetags, True) 448 register_filter('random', random, False) 449 register_filter('rjust', rjust, True) 450 register_filter('slice', slice_, True) 451 register_filter('slugify', slugify, False) 452 register_filter('stringformat', stringformat, True) 453 register_filter('striptags', striptags, False) 454 register_filter('time', time, True) 455 register_filter('timesince', timesince, False) 456 register_filter('title', title, False) 457 register_filter('truncatewords', truncatewords, True) 458 register_filter('unordered_list', unordered_list, False) 459 register_filter('upper', upper, False) 460 register_filter('urlencode', urlencode, False) 461 register_filter('urlize', urlize, False) 462 register_filter('urlizetrunc', urlizetrunc, True) 463 register_filter('wordcount', wordcount, False) 464 register_filter('wordwrap', wordwrap, True) 465 register_filter('yesno', yesno, True) django/trunk/django/core/template/defaulttags.py
r736 r867 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 5 import sys 4 import template 5 6 class CommentNode(template.Node): 6 7 class CommentNode(Node): 7 8 def render(self, context): 8 9 return '' 9 10 10 class CycleNode( template.Node):11 class CycleNode(Node): 11 12 def __init__(self, cyclevars): 12 13 self.cyclevars = cyclevars … … 18 19 return self.cyclevars[self.counter % self.cyclevars_len] 19 20 20 class DebugNode( template.Node):21 class DebugNode(Node): 21 22 def render(self, context): 22 23 from pprint import pformat … … 26 27 return ''.join(output) 27 28 28 class FilterNode( template.Node):29 class FilterNode(Node): 29 30 def __init__(self, filters, nodelist): 30 31 self.filters, self.nodelist = filters, nodelist … … 34 35 # apply filters 35 36 for f in self.filters: 36 output = template.registered_filters[f[0]][0](output, f[1])37 output = registered_filters[f[0]][0](output, f[1]) 37 38 return output 38 39 39 class FirstOfNode( template.Node):40 class FirstOfNode(Node): 40 41 def __init__(self, vars): 41 42 self.vars = vars … … 43 44 def render(self, context): 44 45 for var in self.vars: 45 value = template.resolve_variable(var, context)46 value = resolve_variable(var, context) 46 47 if value: 47 48 return str(value) 48 49 return '' 49 50 50 class ForNode( template.Node):51 class ForNode(Node): 51 52 def __init__(self, loopvar, sequence, reversed, nodelist_loop): 52 53 self.loopvar, self.sequence = loopvar, sequence … … 74 75 75 76 def render(self, context): 76 nodelist = template.NodeList()77 nodelist = NodeList() 77 78 if context.has_key('forloop'): 78 79 parentloop = context['forloop'] … … 81 82 context.push() 82 83 try: 83 values = template.resolve_variable_with_filters(self.sequence, context)84 except template.VariableDoesNotExist:84 values = resolve_variable_with_filters(self.sequence, context) 85 except VariableDoesNotExist: 85 86 values = [] 86 87 if values is None: … … 112 113 return nodelist.render(context) 113 114 114 class IfChangedNode( template.Node):115 class IfChangedNode(Node): 115 116 def __init__(self, nodelist): 116 117 self.nodelist = nodelist … … 130 131 return '' 131 132 132 class IfEqualNode( template.Node):133 class IfEqualNode(Node): 133 134 def __init__(self, var1, var2, nodelist_true, nodelist_false, negate): 134 135 self.var1, self.var2 = var1, var2 … … 140 141 141 142 def render(self, context): 142 val1 = template.resolve_variable(self.var1, context)143 val2 = template.resolve_variable(self.var2, context)143 val1 = resolve_variable(self.var1, context) 144 val2 = resolve_variable(self.var2, context) 144 145 if (self.negate and val1 != val2) or (not self.negate and val1 == val2): 145 146 return self.nodelist_true.render(context) 146 147 return self.nodelist_false.render(context) 147 148 148 class IfNode( template.Node):149 class IfNode(Node): 149 150 def __init__(self, boolvars, nodelist_true, nodelist_false): 150 151 self.boolvars = boolvars … … 171 172 for ifnot, boolvar in self.boolvars: 172 173 try: 173 value = template.resolve_variable_with_filters(boolvar, context)174 except template.VariableDoesNotExist:174 value = resolve_variable_with_filters(boolvar, context) 175 except VariableDoesNotExist: 175 176 value = None 176 177 if (value and not ifnot) or (ifnot and not value): … … 178 179 return self.nodelist_false.render(context) 179 180 180 class RegroupNode( template.Node):181 class RegroupNode(Node): 181 182 def __init__(self, target_var, expression, var_name): 182 183 self.target_var, self.expression = target_var, expression … … 184 185 185 186 def render(self, context): 186 obj_list = template.resolve_variable_with_filters(self.target_var, context)187 obj_list = resolve_variable_with_filters(self.target_var, context) 187 188 if obj_list == '': # target_var wasn't found in context; fail silently 188 189 context[self.var_name] = [] … … 190 191 output = [] # list of dictionaries in the format {'grouper': 'key', 'list': [list of contents]} 191 192 for obj in obj_list: 192 grouper = template.resolve_variable_with_filters('var.%s' % self.expression, \193 template.Context({'var': obj}))193 grouper = resolve_variable_with_filters('var.%s' % self.expression, \ 194 Context({'var': obj})) 194 195 if output and repr(output[-1]['grouper']) == repr(grouper): 195 196 output[-1]['list'].append(obj) … … 206 207 return False 207 208 208 class SsiNode( template.Node):209 class SsiNode(Node): 209 210 def __init__(self, filepath, parsed): 210 211 self.filepath, self.parsed = filepath, parsed … … 221 222 if self.parsed: 222 223 try: 223 t = template.Template(output)224 t = Template(output) 224 225 return t.render(context) 225 except template.TemplateSyntaxError:226 except TemplateSyntaxError: 226 227 return '' # Fail silently for invalid included templates. 227 228 return output 228 229 229 class LoadNode( template.Node):230 class LoadNode(Node): 230 231 def __init__(self, taglib): 231 232 self.taglib = taglib … … 245 246 return '' 246 247 247 class NowNode( template.Node):248 class NowNode(Node): 248 249 def __init__(self, format_string): 249 250 self.format_string = format_string … … 255 256 return df.format(self.format_string) 256 257 257 class TemplateTagNode( template.Node):258 mapping = {'openblock': template.BLOCK_TAG_START,259 'closeblock': template.BLOCK_TAG_END,260 'openvariable': template.VARIABLE_TAG_START,261 'closevariable': template.VARIABLE_TAG_END}258 class TemplateTagNode(Node): 259 mapping = {'openblock': BLOCK_TAG_START, 260 'closeblock': BLOCK_TAG_END, 261 'openvariable': VARIABLE_TAG_START, 262 'closevariable': VARIABLE_TAG_END} 262 263 263 264 def __init__(self, tagtype): … … 267 268 return self.mapping.get(self.tagtype, '') 268 269 269 class WidthRatioNode( template.Node):270 class WidthRatioNode(Node): 270 271 def __init__(self, val_var, max_var, max_width): 271 272 self.val_var = val_var … … 275 276 def render(self, context): 276 277 try: 277 value = template.resolve_variable_with_filters(self.val_var, context)278 maxvalue = template.resolve_variable_with_filters(self.max_var, context)279 except template.VariableDoesNotExist:278 value = resolve_variable_with_filters(self.val_var, context) 279 maxvalue = resolve_variable_with_filters(self.max_var, context) 280 except VariableDoesNotExist: 280 281 return '' 281 282 try: … … 331 332 args = token.contents.split() 332 333 if len(args) < 2: 333 raise template.TemplateSyntaxError("'Cycle' statement requires at least two arguments")334 raise TemplateSyntaxError("'Cycle' statement requires at least two arguments") 334 335 335 336 elif len(args) == 2 and "," in args[1]: … … 342 343 name = args[1] 343 344 if not parser._namedCycleNodes.has_key(name): 344 raise template.TemplateSyntaxError("Named cycle '%s' does not exist" % name)345 raise TemplateSyntaxError("Named cycle '%s' does not exist" % name) 345 346 return parser._namedCycleNodes[name] 346 347 … … 348 349 # {% cycle a,b,c as name %} 349 350 if args[2] != 'as': 350 raise template.TemplateSyntaxError("Second 'cycle' argument must be 'as'")351 raise TemplateSyntaxError("Second 'cycle' argument must be 'as'") 351 352 cyclevars = [v for v in args[1].split(",") if v] # split and kill blanks 352 353 name = args[3] … … 360 361 361 362 else: 362 raise template.TemplateSyntaxError("Invalid arguments to 'cycle': %s" % args)363 raise TemplateSyntaxError("Invalid arguments to 'cycle': %s" % args) 363 364 364 365 def do_debug(parser, token): … … 380 381 """ 381 382 _, rest = token.contents.split(None, 1) 382 _, filters = template.get_filters_from_token('var|%s' % rest)383 _, filters = get_filters_from_token('var|%s' % rest) 383 384 nodelist = parser.parse(('endfilter',)) 384 385 parser.delete_first_token() … … 409 410 bits = token.contents.split()[1:] 410 411 if len(bits) < 1: 411 raise template.TemplateSyntaxError, "'firstof' statement requires at least one argument"412 raise TemplateSyntaxError, "'firstof' statement requires at least one argument" 412 413 return FirstOfNode(bits) 413 414 … … 435 436 ``forloop.counter`` The current iteration of the loop (1-indexed) 436 437 ``forloop.counter0`` The current iteration of the loop (0-indexed) 437 ``forloop.revcounter`` The number of iterations from the end of the 438 ``forloop.revcounter`` The number of iterations from the end of the 438 439 loop (1-indexed) 439 ``forloop.revcounter0`` The number of iterations from the end of the 440 ``forloop.revcounter0`` The number of iterations from the end of the 440 441 loop (0-indexed) 441 442 ``forloop.first`` True if this is the first time through the loop … … 448 449 bits = token.contents.split() 449 450 if len(bits) == 5 and bits[4] != 'reversed': 450 raise template.TemplateSyntaxError, "'for' statements with five words should end in 'reversed': %s" % token.contents451 raise TemplateSyntaxError, "'for' statements with five words should end in 'reversed': %s" % token.contents 451 452 if len(bits) not in (4, 5): 452 raise template.TemplateSyntaxError, "'for' statements should have either four or five words: %s" % token.contents453 raise TemplateSyntaxError, "'for' statements should have either four or five words: %s" % token.contents 453 454 if bits[2] != 'in': 454 raise template.TemplateSyntaxError, "'for' statement must contain 'in' as the second word: %s" % token.contents455 raise TemplateSyntaxError, "'for' statement must contain 'in' as the second word: %s" % token.contents 455 456 loopvar = bits[1] 456 457 sequence = bits[3] … … 478 479 bits = token.contents.split() 479 480 if len(bits) != 3: 480 raise template.TemplateSyntaxError, "%r takes two arguments" % bits[0]481 raise TemplateSyntaxError, "%r takes two arguments" % bits[0] 481 482 end_tag = 'end' + bits[0] 482 483 nodelist_true = parser.parse(('else', end_tag)) … … 486 487 parser.delete_first_token() 487 488 else: 488 nodelist_false = template.NodeList()489 nodelist_false = NodeList() 489 490 return IfEqualNode(bits[1], bits[2], nodelist_true, nodelist_false, negate) 490 491 … … 539 540 del bits[0] 540 541 if not bits: 541 raise template.TemplateSyntaxError, "'if' statement requires at least one argument"542 raise TemplateSyntaxError, "'if' statement requires at least one argument" 542 543 # bits now looks something like this: ['a', 'or', 'not', 'b', 'or', 'c.d'] 543 544 boolpairs = ' '.join(bits).split(' or ') … … 547 548 not_, boolvar = boolpair.split() 548 549 if not_ != 'not': 549 raise template.TemplateSyntaxError, "Expected 'not' in if statement"550 raise TemplateSyntaxError, "Expected 'not' in if statement" 550 551 boolvars.append((True, boolvar)) 551 552 else: … … 557 558 parser.delete_first_token() 558 559 else: 559 nodelist_false = template.NodeList()560 nodelist_false = NodeList() 560 561 return IfNode(boolvars, nodelist_true, nodelist_false) 561 562 … … 577 578 bits = token.contents.split() 578 579 if len(bits) != 1: 579 raise template.TemplateSyntaxError, "'ifchanged' tag takes no arguments"580 raise TemplateSyntaxError, "'ifchanged' tag takes no arguments" 580 581 nodelist = parser.parse(('endifchanged',)) 581 582 parser.delete_first_token() … … 600 601 parsed = False 601 602 if len(bits) not in (2, 3): 602 raise template.TemplateSyntaxError, "'ssi' tag takes one argument: the path to the file to be included"603 raise TemplateSyntaxError, "'ssi' tag takes one argument: the path to the file to be included" 603 604 if len(bits) == 3: 604 605 if bits[2] == 'parsed': 605 606 parsed = True 606 607 else: 607 raise template.TemplateSyntaxError, "Second (optional) argument to %s tag must be 'parsed'" % bits[0]608 raise TemplateSyntaxError, "Second (optional) argument to %s tag must be 'parsed'" % bits[0] 608 609 return SsiNode(bits[1], parsed) 609 610 … … 618 619 bits = token.contents.split() 619 620 if len(bits) != 2: 620 raise template.TemplateSyntaxError, "'load' statement takes one argument"621 raise TemplateSyntaxError, "'load' statement takes one argument" 621 622 taglib = bits[1] 622 623 # check at compile time that the module can be imported … … 624 625 LoadNode.load_taglib(taglib) 625 626 except ImportError: 626 raise template.TemplateSyntaxError, "'%s' is not a valid tag library" % taglib627 raise TemplateSyntaxError, "'%s' is not a valid tag library" % taglib 627 628 return LoadNode(taglib) 628 629 … … 640 641 bits = token.contents.split('"') 641 642 if len(bits) != 3: 642 raise template.TemplateSyntaxError, "'now' statement takes one argument"643 raise TemplateSyntaxError, "'now' statement takes one argument" 643 644 format_string = bits[1] 644 645 return NowNode(format_string) … … 692 693 firstbits = token.contents.split(None, 3) 693 694 if len(firstbits) != 4: 694 raise template.TemplateSyntaxError, "'regroup' tag takes five arguments"695 raise TemplateSyntaxError, "'regroup' tag takes five arguments" 695 696 target_var = firstbits[1] 696 697 if firstbits[2] != 'by': 697 raise template.TemplateSyntaxError, "second argument to 'regroup' tag must be 'by'"698 raise TemplateSyntaxError, "second argument to 'regroup' tag must be 'by'" 698 699 lastbits_reversed = firstbits[3][::-1].split(None, 2) 699 700 if lastbits_reversed[1][::-1] != 'as': 700 raise template.TemplateSyntaxError, "next-to-last argument to 'regroup' tag must be 'as'"701 raise TemplateSyntaxError, "next-to-last argument to 'regroup' tag must be 'as'" 701 702 expression = lastbits_reversed[2][::-1] 702 703 var_name = lastbits_reversed[0][::-1] … … 723 724 bits = token.contents.split() 724 725 if len(bits) != 2: 725 raise template.TemplateSyntaxError, "'templatetag' statement takes one argument"726 raise TemplateSyntaxError, "'templatetag' statement takes one argument" 726 727 tag = bits[1] 727 728 if not TemplateTagNode.mapping.has_key(tag): 728 raise template.TemplateSyntaxError, "Invalid templatetag argument: '%s'. Must be one of: %s" % \729 raise TemplateSyntaxError, "Invalid templatetag argument: '%s'. Must be one of: %s" % \ 729 730 (tag, TemplateTagNode.mapping.keys()) 730 731 return TemplateTagNode(tag) … … 745 746 bits = token.contents.split() 746 747 if len(bits) != 4: 747 raise template.TemplateSyntaxError("widthratio takes three arguments")748 raise TemplateSyntaxError("widthratio takes three arguments") 748 749 tag, this_value_var, max_value_var, max_width = bits 749 750 try: 750 751 max_width = int(max_width) 751 752 except ValueError: 752 raise template.TemplateSyntaxError("widthratio final argument must be an integer")753 raise TemplateSyntaxError("widthratio final argument must be an integer") 753 754 return WidthRatioNode(this_value_var, max_value_var, max_width) 754 755 755 template.register_tag('comment', do_comment)756 template.register_tag('cycle', do_cycle)757 template.register_tag('debug', do_debug)758 template.register_tag('filter', do_filter)759 template.register_tag('firstof', do_firstof)760 template.register_tag('for', do_for)761 template.register_tag('ifequal', lambda parser, token: do_ifequal(parser, token, False))762 template.register_tag('ifnotequal', lambda parser, token: do_ifequal(parser, token, True))763 template.register_tag('if', do_if)764 template.register_tag('ifchanged', do_ifchanged)765 template.register_tag('regroup', do_regroup)766 template.register_tag('ssi', do_ssi)767 template.register_tag('load', do_load)768 template.register_tag('now', do_now)769 template.register_tag('templatetag', do_templatetag)770 template.register_tag('widthratio', do_widthratio)756 register_tag('comment', do_comment) 757 register_tag('cycle', do_cycle) 758 register_tag('debug', do_debug) 759 register_tag('filter', do_filter) 760 register_tag('firstof', do_firstof) 761 register_tag('for', do_for) 762 register_tag('ifequal', lambda parser, token: do_ifequal(parser, token, False)) 763 register_tag('ifnotequal', lambda parser, token: do_ifequal(parser, token, True)) 764 register_tag('if', do_if) 765 register_tag('ifchanged', do_ifchanged) 766 register_tag('regroup', do_regroup) 767 register_tag('ssi', do_ssi) 768 register_tag('load', do_load) 769 register_tag('now', do_now) 770 register_tag('templatetag', do_templatetag) 771 register_tag('widthratio', do_widthratio) django/trunk/django/core/template_loader.py
r717 r867 1 "Wrapper for loading templates from storage of some sort (e.g. files or db)" 2 import template 3 from template_file import load_template_source 1 # This module is DEPRECATED! 2 # 3 # You should no longer be using django.core.template_loader. 4 # 5 # Use django.core.template.loader instead. 4 6 5 class ExtendsError(Exception): 6 pass 7 8 def get_template(template_name): 9 """ 10 Returns a compiled template.Template object for the given template name, 11 handling template inheritance recursively. 12 """ 13 return get_template_from_string(load_template_source(template_name)) 14 15 def get_template_from_string(source): 16 """ 17 Returns a compiled template.Template object for the given template code, 18 handling template inheritance recursively. 19 """ 20 return template.Template(source) 21 22 def render_to_string(template_name, dictionary=None, context_instance=None): 23 """ 24 Loads the given template_name and renders it with the given dictionary as 25 context. The template_name may be a string to load a single template using 26 get_template, or it may be a tuple to use select_template to find one of 27 the templates in the list. Returns a string. 28 """ 29 dictionary = dictionary or {} 30 if isinstance(template_name, (list, tuple)): 31 t = select_template(template_name) 32 else: 33 t = get_template(template_name) 34 if context_instance: 35 context_instance.update(dictionary) 36 else: 37 context_instance = template.Context(dictionary) 38 return t.render(context_instance) 39 40 def select_template(template_name_list): 41 "Given a list of template names, returns the first that can be loaded." 42 for template_name in template_name_list: 43 try: 44 return get_template(template_name) 45 except template.TemplateDoesNotExist: 46 continue 47 # If we get here, none of the templates could be loaded 48 raise template.TemplateDoesNotExist, ', '.join(template_name_list) 49 50 class BlockNode(template.Node): 51 def __init__(self, name, nodelist, parent=None): 52 self.name, self.nodelist, self.parent = name, nodelist, parent 53 54 def __repr__(self): 55 return "<Block Node: %s. Contents: %r>" % (self.name, self.nodelist) 56 57 def render(self, context): 58 context.push() 59 # Save context in case of block.super(). 60 self.context = context 61 context['block'] = self 62 result = self.nodelist.render(context) 63 context.pop() 64 return result 65 66 def super(self): 67 if self.parent: 68 return self.parent.render(self.context) 69 return '' 70 71 def add_parent(self, nodelist): 72 if self.parent: 73 self.parent.add_parent(nodelist) 74 else: 75 self.parent = BlockNode(self.name, nodelist) 76 77 class ExtendsNode(template.Node): 78 def __init__(self, nodelist, parent_name, parent_name_var, template_dirs=None): 79 self.nodelist = nodelist 80 self.parent_name, self.parent_name_var = parent_name, parent_name_var 81 self.template_dirs = template_dirs 82 83 def get_parent(self, context): 84 if self.parent_name_var: 85 self.parent_name = template.resolve_variable_with_filters(self.parent_name_var, context) 86 parent = self.parent_name 87 if not parent: 88 error_msg = "Invalid template name in 'extends' tag: %r." % parent 89 if self.parent_name_var: 90 error_msg += " Got this from the %r variable." % self.parent_name_var 91 raise template.TemplateSyntaxError, error_msg 92 try: 93 return get_template_from_string(load_template_source(parent, self.template_dirs)) 94 except template.TemplateDoesNotExist: 95 raise template.TemplateSyntaxError, "Template %r cannot be extended, because it doesn't exist" % parent 96 97 def render(self, context): 98 compiled_parent = self.get_parent(context) 99 parent_is_child = isinstance(compiled_parent.nodelist[0], ExtendsNode) 100 parent_blocks = dict([(n.name, n) for n in compiled_parent.nodelist.get_nodes_by_type(BlockNode)]) 101 for block_node in self.nodelist.get_nodes_by_type(BlockNode): 102 # Check for a BlockNode with this node's name, and replace it if found. 103 try: 104 parent_block = parent_blocks[block_node.name] 105 except KeyError: 106 # This BlockNode wasn't found in the parent template, but the 107 # parent block might be defined in the parent's *parent*, so we 108 # add this BlockNode to the parent's ExtendsNode nodelist, so 109 # it'll be checked when the parent node's render() is called. 110 if parent_is_child: 111 compiled_parent.nodelist[0].nodelist.append(block_node) 112 else: 113 # Keep any existing parents and add a new one. Used by BlockNode. 114 parent_block.parent = block_node.parent 115 parent_block.add_parent(parent_block.nodelist) 116 parent_block.nodelist = block_node.nodelist 117 return compiled_parent.render(context) 118 119 def do_block(parser, token): 120 """ 121 Define a block that can be overridden by child templates. 122 """ 123 bits = token.contents.split() 124 if len(bits) != 2: 125 raise template.TemplateSyntaxError, "'%s' tag takes only one argument" % bits[0] 126 block_name = bits[1] 127 # Keep track of the names of BlockNodes found in this template, so we can 128 # check for duplication. 129 try: 130 if block_name in parser.__loaded_blocks: 131 raise template.TemplateSyntaxError, "'%s' tag with name '%s' appears more than once" % (bits[0], block_name) 132 parser.__loaded_blocks.append(block_name) 133 except AttributeError: # parser._loaded_blocks isn't a list yet 134 parser.__loaded_blocks = [block_name] 135 nodelist = parser.parse(('endblock',)) 136 parser.delete_first_token() 137 return BlockNode(block_name, nodelist) 138 139 def do_extends(parser, token): 140 """ 141 Signal that this template extends a parent template. 142 143 This tag may be used in two ways: ``{% extends "base" %}`` (with quotes) 144 uses the literal value "base" as the name of the parent template to extend, 145 or ``{% entends variable %}`` uses the value of ``variable`` as the name 146 of the parent template to extend. 147 """ 148 bits = token.contents.split() 149 if len(bits) != 2: 150 raise template.TemplateSyntaxError, "'%s' takes one argument" % bits[0] 151 parent_name, parent_name_var = None, None 152 if (bits[1].startswith('"') and bits[1].endswith('"')) or (bits[1].startswith("'") and bits[1].endswith("'")): 153 parent_name = bits[1][1:-1] 154 else: 155 parent_name_var = bits[1] 156 nodelist = parser.parse() 157 if nodelist.get_nodes_by_type(ExtendsNode): 158 raise template.TemplateSyntaxError, "'%s' cannot appear more than once in the same template" % bits[0] 159 return ExtendsNode(nodelist, parent_name, parent_name_var) 160 161 template.register_tag('block', do_block) 162 template.register_tag('extends', do_extends) 7 from django.core.template.loader import * django/trunk/django/core/template/loaders/filesystem.py
r721 r867 1 # Wrapper for loading templates from files1 # Wrapper for loading templates from the filesystem. 2 2 3 3 from django.conf.settings import TEMPLATE_DIRS, TEMPLATE_FILE_EXTENSION django/trunk/django/middleware/admin.py
r669 r867 1 1 from django.utils import httpwrappers 2 from django.core import template_loader3 from django.core.extensions import DjangoContext as Context2 from django.core.extensions import DjangoContext 3 from django.core.extensions import render_to_response 4 4 from django.models.auth import users 5 5 from django.views.registration import passwords … … 97 97 else: 98 98 post_data = encode_post_data({}) 99 t = template_loader.get_template(self.get_login_template_name()) 100 c = Context(request, { 99 return render_to_response(self.get_login_template_name(), { 101 100 'title': 'Log in', 102 101 'app_path': request.path, 103 102 'post_data': post_data, 104 103 'error_message': error_message 105 }) 106 return httpwrappers.HttpResponse(t.render(c)) 104 }, context_instance=DjangoContext(request)) 107 105 108 106 def authenticate_user(self, user, password): django/trunk/django/views/admin/doc.py
r665 r867 5 5 from django.core.extensions import DjangoContext, render_to_response 6 6 from django.core.exceptions import Http404, ViewDoesNotExist 7 from django.core import template, template_loader, defaulttags, defaultfilters, urlresolvers 7 from django.core import template, template_loader, urlresolvers 8 from django.core.template import defaulttags, defaultfilters 8 9 try: 9 10 from django.parts.admin import doc django/trunk/django/views/admin/template.py
r675 r867 1 from django.core import formfields, template_loader,validators1 from django.core import formfields, validators 2 2 from django.core import template 3 from django.core.template import loader 3 4 from django.core.extensions import DjangoContext, render_to_response 4 5 from django.models.core import sites … … 50 51 # for "extends" that uses the site's TEMPLATE_DIR instead 51 52 def new_do_extends(parser, token): 52 node = template_loader.do_extends(parser, token)53 node = loader.do_extends(parser, token) 53 54 node.template_dirs = settings_module.TEMPLATE_DIRS 54 55 return node … … 59 60 error = None 60 61 try: 61 tmpl = template_loader.get_template_from_string(field_data)62 tmpl = loader.get_template_from_string(field_data) 62 63 tmpl.render(template.Context({})) 63 64 except template.TemplateSyntaxError, e: 64 65 error = e 65 template.register_tag('extends', template_loader.do_extends)66 template.register_tag('extends', loader.do_extends) 66 67 if error: 67 68 raise validators.ValidationError, e.args django/trunk/django/views/auth/login.py
