Changeset 5482
- Timestamp:
- 06/17/07 02:11:37 (1 year ago)
- Files:
-
- django/trunk/django/contrib/admin/templatetags/adminapplist.py (modified) (2 diffs)
- django/trunk/django/contrib/admin/templatetags/admin_modify.py (modified) (4 diffs)
- django/trunk/django/contrib/admin/templatetags/log.py (modified) (2 diffs)
- django/trunk/django/contrib/comments/templatetags/comments.py (modified) (8 diffs)
- django/trunk/django/core/servers/basehttp.py (modified) (4 diffs)
- django/trunk/django/http/__init__.py (modified) (2 diffs)
- django/trunk/django/oldforms/__init__.py (modified) (1 diff)
- django/trunk/django/shortcuts/__init__.py (modified) (1 diff)
- django/trunk/django/template/defaulttags.py (modified) (26 diffs)
- django/trunk/django/template/__init__.py (modified) (10 diffs)
- django/trunk/django/template/loader.py (modified) (2 diffs)
- django/trunk/django/template/loader_tags.py (modified) (5 diffs)
- django/trunk/django/test/utils.py (modified) (3 diffs)
- django/trunk/django/views/debug.py (modified) (3 diffs)
- django/trunk/django/views/defaults.py (modified) (2 diffs)
- django/trunk/django/views/generic/create_update.py (modified) (3 diffs)
- django/trunk/django/views/generic/date_based.py (modified) (6 diffs)
- django/trunk/django/views/generic/list_detail.py (modified) (2 diffs)
- django/trunk/django/views/generic/simple.py (modified) (1 diff)
- django/trunk/django/views/static.py (modified) (1 diff)
- django/trunk/docs/templates_python.txt (modified) (7 diffs)
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
django/trunk/django/contrib/admin/templatetags/adminapplist.py
r4265 r5482 8 8 self.varname = varname 9 9 10 def render(self, context):10 def iter_render(self, context): 11 11 from django.db import models 12 12 from django.utils.text import capfirst … … 55 55 }) 56 56 context[self.varname] = app_list 57 return ''57 return () 58 58 59 59 def get_admin_app_list(parser, token): django/trunk/django/contrib/admin/templatetags/admin_modify.py
r5091 r5482 95 95 get_nodelist = classmethod(get_nodelist) 96 96 97 def render(self, context):97 def iter_render(self, context): 98 98 bound_field = template.resolve_variable(self.bound_field_var, context) 99 99 … … 101 101 context['bound_field'] = bound_field 102 102 103 output = self.get_nodelist(bound_field.field.__class__).render(context) 103 for chunk in self.get_nodelist(bound_field.field.__class__).iter_render(context): 104 yield chunk 104 105 context.pop() 105 return output106 106 107 107 class FieldWrapper(object): … … 158 158 self.rel_var = rel_var 159 159 160 def render(self, context):160 def iter_render(self, context): 161 161 relation = template.resolve_variable(self.rel_var, context) 162 162 context.push() … … 170 170 bound_related_object = relation.bind(context['form'], original, bound_related_object_class) 171 171 context['bound_related_object'] = bound_related_object 172 t = loader.get_template(bound_related_object.template_name())173 output = t.render(context)172 for chunk in loader.get_template(bound_related_object.template_name()).iter_render(context): 173 yield chunk 174 174 context.pop() 175 return output176 175 177 176 def output_all(form_fields): django/trunk/django/contrib/admin/templatetags/log.py
r5170 r5482 11 11 return "<GetAdminLog Node>" 12 12 13 def render(self, context):13 def iter_render(self, context): 14 14 if self.user is None: 15 15 context[self.varname] = LogEntry.objects.all().select_related()[:self.limit] … … 18 18 self.user = context[self.user].id 19 19 context[self.varname] = LogEntry.objects.filter(user__id__exact=self.user).select_related()[:self.limit] 20 return ''20 return () 21 21 22 22 class DoGetAdminLog: django/trunk/django/contrib/comments/templatetags/comments.py
r5091 r5482 25 25 self.is_public = is_public 26 26 27 def render(self, context):27 def iter_render(self, context): 28 28 from django.conf import settings 29 29 from django.utils.text import normalize_newlines … … 34 34 self.obj_id = template.resolve_variable(self.obj_id_lookup_var, context) 35 35 except template.VariableDoesNotExist: 36 return ''36 return 37 37 # Validate that this object ID is valid for this content-type. 38 38 # We only have to do this validation if obj_id_lookup_var is provided, … … 68 68 context['logout_url'] = settings.LOGOUT_URL 69 69 default_form = loader.get_template(COMMENT_FORM) 70 output = default_form.render(context) 70 for chunk in default_form.iter_render(context): 71 yield chunk 71 72 context.pop() 72 return output73 73 74 74 class CommentCountNode(template.Node): … … 78 78 self.var_name, self.free = var_name, free 79 79 80 def render(self, context):80 def iter_render(self, context): 81 81 from django.conf import settings 82 82 manager = self.free and FreeComment.objects or Comment.objects … … 87 87 content_type__model__exact=self.module, site__id__exact=settings.SITE_ID).count() 88 88 context[self.var_name] = comment_count 89 return ''89 return () 90 90 91 91 class CommentListNode(template.Node): … … 97 97 self.extra_kwargs = extra_kwargs or {} 98 98 99 def render(self, context):99 def iter_render(self, context): 100 100 from django.conf import settings 101 101 get_list_function = self.free and FreeComment.objects.filter or Comment.objects.get_list_with_karma … … 104 104 self.obj_id = template.resolve_variable(self.context_var_name, context) 105 105 except template.VariableDoesNotExist: 106 return ''106 return () 107 107 kwargs = { 108 108 'object_id__exact': self.obj_id, … … 128 128 129 129 context[self.var_name] = comment_list 130 return ''130 return () 131 131 132 132 class DoCommentForm: django/trunk/django/core/servers/basehttp.py
r5091 r5482 310 310 if not self.result_is_file() and not self.sendfile(): 311 311 for data in self.result: 312 self.write(data )312 self.write(data, False) 313 313 self.finish_content() 314 314 self.close() … … 378 378 self._write('Status: %s\r\n' % self.status) 379 379 380 def write(self, data ):380 def write(self, data, flush=True): 381 381 """'write()' callable as specified by PEP 333""" 382 382 … … 395 395 # XXX check Content-Length and truncate if too many bytes written? 396 396 self._write(data) 397 self._flush() 397 if flush: 398 self._flush() 398 399 399 400 def sendfile(self): … … 422 423 self.headers['Content-Length'] = "0" 423 424 self.send_headers() 424 else:425 pass # XXX check if content-length was too short?426 425 427 426 def close(self): django/trunk/django/http/__init__.py
r5289 r5482 223 223 if isinstance(content, unicode): 224 224 content = content.encode(self._charset) 225 226 # If self._container was an iterator, we have just exhausted it, so we 227 # need to save the results for anything else that needs access 228 if not self._is_string: 229 self._container = [content] 230 self._is_string = True 225 231 return content 226 232 … … 232 238 233 239 def __iter__(self): 234 self._iterator = self._container.__iter__() 235 return self 236 237 def next(self): 238 chunk = self._iterator.next() 239 if isinstance(chunk, unicode): 240 chunk = chunk.encode(self._charset) 241 return chunk 240 for chunk in self._container: 241 if isinstance(chunk, unicode): 242 chunk = chunk.encode(self._charset) 243 yield chunk 242 244 243 245 def close(self): django/trunk/django/oldforms/__init__.py
r5398 r5482 309 309 return data 310 310 html2python = staticmethod(html2python) 311 312 def iter_render(self, data): 313 # this even needed? 314 return (self.render(data),) 311 315 312 316 def render(self, data): django/trunk/django/shortcuts/__init__.py
r4756 r5482 8 8 9 9 def render_to_response(*args, **kwargs): 10 return HttpResponse(loader.render_to_ string(*args, **kwargs))10 return HttpResponse(loader.render_to_iter(*args, **kwargs)) 11 11 load_and_render = render_to_response # For backwards compatibility. 12 12 django/trunk/django/template/defaulttags.py
r5454 r5482 15 15 yield data[index] 16 16 17 18 17 register = Library() 19 18 20 19 class CommentNode(Node): 21 def render(self, context):22 return ''20 def iter_render(self, context): 21 return () 23 22 24 23 class CycleNode(Node): … … 29 28 self.variable_name = variable_name 30 29 30 def iter_render(self, context): 31 return (self.render(context),) 32 31 33 def render(self, context): 32 34 self.counter += 1 … … 37 39 38 40 class DebugNode(Node): 39 def render(self, context):41 def iter_render(self, context): 40 42 from pprint import pformat 41 output = [pformat(val) for val in context]42 output.append('\n\n')43 output.append(pformat(sys.modules))44 return ''.join(output)43 for val in context: 44 yield pformat(val) 45 yield "\n\n" 46 yield pformat(sys.modules) 45 47 46 48 class FilterNode(Node): … … 48 50 self.filter_expr, self.nodelist = filter_expr, nodelist 49 51 50 def render(self, context):52 def iter_render(self, context): 51 53 output = self.nodelist.render(context) 52 54 # apply filters … … 54 56 filtered = self.filter_expr.resolve(context) 55 57 context.pop() 56 return filtered58 return (filtered,) 57 59 58 60 class FirstOfNode(Node): 59 61 def __init__(self, vars): 60 62 self.vars = vars 63 64 def iter_render(self, context): 65 return (self.render(context),) 61 66 62 67 def render(self, context): … … 95 100 return nodes 96 101 97 def render(self, context): 98 nodelist = NodeList() 102 def iter_render(self, context): 99 103 if 'forloop' in context: 100 104 parentloop = context['forloop'] … … 104 108 try: 105 109 values = self.sequence.resolve(context, True) 110 if values is None: 111 values = () 112 elif not hasattr(values, '__len__'): 113 values = list(values) 106 114 except VariableDoesNotExist: 107 values = [] 108 if values is None: 109 values = [] 110 if not hasattr(values, '__len__'): 111 values = list(values) 115 values = () 112 116 len_values = len(values) 113 117 if self.reversed: … … 128 132 } 129 133 if unpack: 130 # If there are multiple loop variables, unpack the item into them. 134 # If there are multiple loop variables, unpack the item into 135 # them. 131 136 context.update(dict(zip(self.loopvars, item))) 132 137 else: 133 138 context[self.loopvars[0]] = item 139 140 # We inline this to avoid the overhead since ForNode is pretty 141 # common. 134 142 for node in self.nodelist_loop: 135 nodelist.append(node.render(context)) 143 for chunk in node.iter_render(context): 144 yield chunk 136 145 if unpack: 137 146 # The loop variables were pushed on to the context so pop them … … 142 151 context.pop() 143 152 context.pop() 144 return nodelist.render(context)145 153 146 154 class IfChangedNode(Node): … … 150 158 self._varlist = varlist 151 159 152 def render(self, context):160 def iter_render(self, context): 153 161 if 'forloop' in context and context['forloop']['first']: 154 162 self._last_seen = None … … 168 176 context.push() 169 177 context['ifchanged'] = {'firstloop': firstloop} 170 content = self.nodelist.render(context) 178 for chunk in self.nodelist.iter_render(context): 179 yield chunk 171 180 context.pop() 172 return content173 else:174 return ''175 181 176 182 class IfEqualNode(Node): … … 183 189 return "<IfEqualNode>" 184 190 185 def render(self, context):191 def iter_render(self, context): 186 192 try: 187 193 val1 = resolve_variable(self.var1, context) … … 193 199 val2 = None 194 200 if (self.negate and val1 != val2) or (not self.negate and val1 == val2): 195 return self.nodelist_true. render(context)196 return self.nodelist_false. render(context)201 return self.nodelist_true.iter_render(context) 202 return self.nodelist_false.iter_render(context) 197 203 198 204 class IfNode(Node): … … 219 225 return nodes 220 226 221 def render(self, context):227 def iter_render(self, context): 222 228 if self.link_type == IfNode.LinkTypes.or_: 223 229 for ifnot, bool_expr in self.bool_exprs: … … 227 233 value = None 228 234 if (value and not ifnot) or (ifnot and not value): 229 return self.nodelist_true. render(context)230 return self.nodelist_false. render(context)235 return self.nodelist_true.iter_render(context) 236 return self.nodelist_false.iter_render(context) 231 237 else: 232 238 for ifnot, bool_expr in self.bool_exprs: … … 236 242 value = None 237 243 if not ((value and not ifnot) or (ifnot and not value)): 238 return self.nodelist_false. render(context)239 return self.nodelist_true. render(context)244 return self.nodelist_false.iter_render(context) 245 return self.nodelist_true.iter_render(context) 240 246 241 247 class LinkTypes: … … 248 254 self.var_name = var_name 249 255 250 def render(self, context):256 def iter_render(self, context): 251 257 obj_list = self.target.resolve(context, True) 252 258 if obj_list == None: # target_var wasn't found in context; fail silently 253 259 context[self.var_name] = [] 254 return ''260 return () 255 261 output = [] # list of dictionaries in the format {'grouper': 'key', 'list': [list of contents]} 256 262 for obj in obj_list: … … 262 268 output.append({'grouper': grouper, 'list': [obj]}) 263 269 context[self.var_name] = output 264 return ''270 return () 265 271 266 272 def include_is_allowed(filepath): … … 274 280 self.filepath, self.parsed = filepath, parsed 275 281 276 def render(self, context):282 def iter_render(self, context): 277 283 if not include_is_allowed(self.filepath): 278 284 if settings.DEBUG: 279 return "[Didn't have permission to include file]"285 return ("[Didn't have permission to include file]",) 280 286 else: 281 287 return '' # Fail silently for invalid includes. … … 288 294 if self.parsed: 289 295 try: 290 t = Template(output, name=self.filepath) 291 return t.render(context) 296 return Template(output, name=self.filepath).iter_render(context) 292 297 except TemplateSyntaxError, e: 293 298 if settings.DEBUG: … … 295 300 else: 296 301 return '' # Fail silently for invalid included templates. 297 return output302 return (output,) 298 303 299 304 class LoadNode(Node): 300 def render(self, context):301 return ''305 def iter_render(self, context): 306 return () 302 307 303 308 class NowNode(Node): 304 309 def __init__(self, format_string): 305 310 self.format_string = format_string 311 312 def iter_render(self, context): 313 return (self.render(context),) 306 314 307 315 def render(self, context): … … 333 341 self.tagtype = tagtype 334 342 343 def iter_render(self, context): 344 return (self.render(context),) 345 335 346 def render(self, context): 336 347 return self.mapping.get(self.tagtype, '') … … 342 353 self.kwargs = kwargs 343 354 344 def render(self, context):355 def iter_render(self, context): 345 356 from django.core.urlresolvers import reverse, NoReverseMatch 346 357 args = [arg.resolve(context) for arg in self.args] 347 358 kwargs = dict([(k, v.resolve(context)) for k, v in self.kwargs.items()]) 348 359 try: 349 return reverse(self.view_name, args=args, kwargs=kwargs)360 return (reverse(self.view_name, args=args, kwargs=kwargs),) 350 361 except NoReverseMatch: 351 362 try: … … 353 364 return reverse(project_name + '.' + self.view_name, args=args, kwargs=kwargs) 354 365 except NoReverseMatch: 355 return ''366 return () 356 367 357 368 class WidthRatioNode(Node): … … 360 371 self.max_expr = max_expr 361 372 self.max_width = max_width 373 374 def iter_render(self, context): 375 return (self.render(context),) 362 376 363 377 def render(self, context): … … 384 398 return "<WithNode>" 385 399 386 def render(self, context):400 def iter_render(self, context): 387 401 val = self.var.resolve(context) 388 402 context.push() 389 403 context[self.name] = val 390 output = self.nodelist.render(context) 404 for chunk in self.nodelist.iter_render(context): 405 yield chunk 391 406 context.pop() 392 return output393 407 394 408 #@register.tag django/trunk/django/template/__init__.py
r5333 r5482 56 56 """ 57 57 import re 58 import types 58 59 from inspect import getargspec 59 60 from django.conf import settings … … 168 169 yield subnode 169 170 171 def iter_render(self, context): 172 "Display stage -- can be called many times" 173 return self.nodelist.iter_render(context) 174 170 175 def render(self, context): 171 "Display stage -- can be called many times" 172 return self.nodelist.render(context) 176 return ''.join(self.iter_render(context)) 173 177 174 178 def compile_string(template_string, origin): … … 699 703 return current 700 704 705 class NodeBase(type): 706 def __new__(cls, name, bases, attrs): 707 """ 708 Ensures that either a 'render' or 'render_iter' method is defined on 709 any Node sub-class. This avoids potential infinite loops at runtime. 710 """ 711 if not (isinstance(attrs.get('render'), types.FunctionType) or 712 isinstance(attrs.get('iter_render'), types.FunctionType)): 713 raise TypeError('Unable to create Node subclass without either "render" or "iter_render" method.') 714 return type.__new__(cls, name, bases, attrs) 715 701 716 class Node(object): 717 __metaclass__ = NodeBase 718 719 def iter_render(self, context): 720 return (self.render(context),) 721 702 722 def render(self, context): 703 723 "Return the node rendered as a string" 704 pass724 return ''.join(self.iter_render(context)) 705 725 706 726 def __iter__(self): … … 718 738 class NodeList(list): 719 739 def render(self, context): 720 bits = [] 740 return ''.join(self.iter_render(context)) 741 742 def iter_render(self, context): 721 743 for node in self: 722 if isinstance(node, Node): 723 bits.append(self.render_node(node, context)) 724 else: 725 bits.append(node) 726 return ''.join(bits) 744 for chunk in node.iter_render(context): 745 yield chunk 727 746 728 747 def get_nodes_by_type(self, nodetype): … … 733 752 return nodes 734 753 735 def render_node(self, node, context):736 return(node.render(context))737 754 738 755 class DebugNodeList(NodeList): 739 def render_node(self, node, context): 740 try: 741 result = node.render(context) 742 except TemplateSyntaxError, e: 743 if not hasattr(e, 'source'): 744 e.source = node.source 745 raise 746 except Exception, e: 747 from sys import exc_info 748 wrapped = TemplateSyntaxError('Caught an exception while rendering: %s' % e) 749 wrapped.source = node.source 750 wrapped.exc_info = exc_info() 751 raise wrapped 752 return result 756 def iter_render(self, context): 757 for node in self: 758 if not isinstance(node, Node): 759 yield node 760 continue 761 try: 762 for chunk in node.iter_render(context): 763 yield chunk 764 except TemplateSyntaxError, e: 765 if not hasattr(e, 'source'): 766 e.source = node.source 767 raise 768 except Exception, e: 769 from sys import exc_info 770 wrapped = TemplateSyntaxError('Caught an exception while rendering: %s' % e) 771 wrapped.source = node.source 772 wrapped.exc_info = exc_info() 773 raise wrapped 753 774 754 775 class TextNode(Node): … … 758 779 def __repr__(self): 759 780 return "<Text Node: '%s'>" % self.s[:25] 781 782 def iter_render(self, context): 783 return (self.s,) 760 784 761 785 def render(self, context): … … 781 805 else: 782 806 return output 807 808 def iter_render(self, context): 809 return (self.render(context),) 783 810 784 811 def render(self, context): … … 870 897 self.vars_to_resolve = vars_to_resolve 871 898 899 #def iter_render(self, context): 900 # return (self.render(context),) 901 872 902 def render(self, context): 873 903 resolved_vars = [resolve_variable(var, context) for var in self.vars_to_resolve] … … 892 922 self.vars_to_resolve = vars_to_resolve 893 923 894 def render(self, context):924 def iter_render(self, context): 895 925 resolved_vars = [resolve_variable(var, context) for var in self.vars_to_resolve] 896 926 if takes_context: … … 908 938 t = get_template(file_name) 909 939 self.nodelist = t.nodelist 910 return self.nodelist. render(context_class(dict))940 return self.nodelist.iter_render(context_class(dict)) 911 941 912 942 compile_func = curry(generic_tag_compiler, params, defaults, getattr(func, "_decorated_function", func).__name__, InclusionNode) django/trunk/django/template/loader.py
r4265 r5482 88 88 return Template(source, origin, name) 89 89 90 def render_to_string(template_name, dictionary=None, context_instance=None):90 def _render_setup(template_name, dictionary=None, context_instance=None): 91 91 """ 92 Loads the given template_name and renders it with the given dictionary as 93 context. The template_name may be a string to load a single template using 94 get_template, or it may be a tuple to use select_template to find one of 95 the templates in the list. Returns a string. 92 Common setup code for render_to_string and render_to_iter. 96 93 """ 97 dictionary = dictionary or {} 94 if dictionary is None: 95 dictionary = {} 98 96 if isinstance(template_name, (list, tuple)): 99 97 t = select_template(template_name) … … 104 102 else: 105 103 context_instance = Context(dictionary) 106 return t.render(context_instance) 104 return t, context_instance 105 106 def render_to_string(template_name, dictionary=None, context_instance=None): 107 """ 108 Loads the given template_name and renders it with the given dictionary as 109 context. The template_name may be a string to load a single template using 110 get_template, or it may be a tuple to use select_template to find one of 111 the templates in the list. Returns a string. 112 """ 113 t, c = _render_setup(template_name, dictionary=dictionary, context_instance=context_instance) 114 return t.render(c) 115 116 def render_to_iter(template_name, dictionary=None, context_instance=None): 117 """ 118 Loads the given template_name and renders it with the given dictionary as 119 context. The template_name may be a string to load a single template using 120 get_template, or it may be a tuple to use select_template to find one of 121 the templates in the list. Returns a string. 122 """ 123 t, c = _render_setup(template_name, dictionary=dictionary, context_instance=context_instance) 124 return t.iter_render(c) 125 107 126 108 127 def select_template(template_name_list): django/trunk/django/template/loader_tags.py
r4492 r5482 16 16 return "<Block Node: %s. Contents: %r>" % (self.name, self.nodelist) 17 17 18 def render(self, context):18 def iter_render(self, context): 19 19 context.push() 20 20 # Save context in case of block.super(). 21 21 self.context = context 22 22 context['block'] = self 23 result = self.nodelist.render(context) 23 for chunk in self.nodelist.iter_render(context): 24 yield chunk 24 25 context.pop() 25 return result26 26 27 27 def super(self): … … 60 60 return get_template_from_string(source, origin, parent) 61 61 62 def render(self, context):62 def iter_render(self, context): 63 63 compiled_parent = self.get_parent(context) 64 64 parent_is_child = isinstance(compiled_parent.nodelist[0], ExtendsNode) … … 80 80 parent_block.add_parent(parent_block.nodelist) 81 81 parent_block.nodelist = block_node.nodelist 82 return compiled_parent. render(context)82 return compiled_parent.iter_render(context) 83 83 84 84 class ConstantIncludeNode(Node): … … 92 92 self.template = None 93 93 94 def render(self, context):94 def iter_render(self, context): 95 95 if self.template: 96 return self.template.render(context) 97 else: 98 return '' 96 return self.template.iter_render(context) 97 return () 99 98 100 99 class IncludeNode(Node): … … 102 101 self.template_name = template_name 103 102 104 def render(self, context):103 def iter_render(self, context): 105 104 try: 106 105 template_name = resolve_variable(self.template_name, context) 107 106 t = get_template(template_name) 108 return t. render(context)107 return t.iter_render(context) 109 108 except TemplateSyntaxError, e: 110 109 if settings.TEMPLATE_DEBUG: 111 110 raise 112 return ''111 return () 113 112 except: 114 return ''# Fail silently for invalid included templates.113 return () # Fail silently for invalid included templates. 115 114 116 115 def do_block(parser, token): django/trunk/django/test/utils.py
r5380 r5482 12 12 13 13 def instrumented_test_render(self, context): 14 """ An instrumented Template render method, providing a signal15 that can be intercepted by the test system Client16 14 """ 15 An instrumented Template render method, providing a signal that can be 16 intercepted by the test system Client. 17 17 """ 18 18 dispatcher.send(signal=signals.template_rendered, sender=self, template=self, context=context) 19 19 return self.nodelist.render(context) 20 21 def instrumented_test_iter_render(self, context): 22 """ 23 An instrumented Template iter_render method, providing a signal that can be 24 intercepted by the test system Client. 25 """ 26 for chunk in self.nodelist.iter_render(context): 27 yield chunk 28 dispatcher.send(signal=signals.template_rendered, sender=self, template=self, context=context) 20 29 21 30 class TestSMTPConnection(object): … … 45 54 """ 46 55 Template.original_render = Template.render 56 Template.original_iter_render = Template.iter_render 47 57 Template.render = instrumented_test_render 58 Template.iter_render = instrumented_test_render 48 59 49 60 mail.original_SMTPConnection = mail.SMTPConnection … … 60 71 """ 61 72 Template.render = Template.original_render 62 del Template.original_render 73 Template.iter_render = Template.original_iter_render 74 del Template.original_render, Template.original_iter_render 63 75 64 76 mail.SMTPConnection = mail.original_SMTPConnection django/trunk/django/views/debug.py
r5456 r5482 138 138 'loader_debug_info': loader_debug_info, 139 139 }) 140 return HttpResponseServerError(t. render(c), mimetype='text/html')140 return HttpResponseServerError(t.iter_render(c), mimetype='text/html') 141 141 142 142 def technical_404_response(request, exception): … … 161 161 'settings': get_safe_settings(), 162 162 }) 163 return HttpResponseNotFound(t. render(c), mimetype='text/html')163 return HttpResponseNotFound(t.iter_render(c), mimetype='text/html') 164 164 165 165 def empty_urlconf(request): … … 169 169 'project_name': settings.SETTINGS_MODULE.split('.')[0] 170 170 }) 171 return HttpResponseNotFound(t. render(c), mimetype='text/html')171 return HttpResponseNotFound(t.iter_render(c), mimetype='text/html') 172 172 173 173 def _get_lines_from_file(filename, lineno, context_lines, loader=None, module_name=None): django/trunk/django/views/defaults.py
r4612 r5482 77 77 """ 78 78 t = loader.get_template(template_name) # You need to create a 404.html template. 79 return http.HttpResponseNotFound(t. render(RequestContext(request, {'request_path': request.path})))79 return http.HttpResponseNotFound(t.iter_render(RequestContext(request, {'request_path': request.path}))) 80 80 81 81 def server_error(request, template_name='500.html'): … … 87 87 """ 88 88 t = loader.get_template(template_name) # You need to create a 500.html template. 89 return http.HttpResponseServerError(t. render(Context({})))89 return http.HttpResponseServerError(t.iter_render(Context({})))
