3
3
from django .core import mail
4
4
from django .template .context import make_context
5
5
from django .template .loader import get_template
6
+ from django .template .loader_tags import BlockNode , ExtendsNode
6
7
from django .views .generic .base import ContextMixin
7
8
8
9
@@ -60,8 +61,9 @@ def render(self):
60
61
context = make_context (self .get_context_data (), request = self .request )
61
62
template = get_template (self .template_name )
62
63
with context .bind_template (template .template ):
63
- for node in template .template .nodelist :
64
- self ._process_node (node , context )
64
+ blocks = self ._get_blocks (template .template .nodelist , context )
65
+ for block_node in blocks .values ():
66
+ self ._process_block (block_node , context )
65
67
self ._attach_body ()
66
68
67
69
def send (self , to , * args , ** kwargs ):
@@ -77,10 +79,21 @@ def send(self, to, *args, **kwargs):
77
79
78
80
super (BaseEmailMessage , self ).send (* args , ** kwargs )
79
81
80
- def _process_node (self , node , context ):
81
- attr = self ._node_map .get (getattr ( node , ' name' , '' ) )
82
+ def _process_block (self , block_node , context ):
83
+ attr = self ._node_map .get (block_node . name )
82
84
if attr is not None :
83
- setattr (self , attr , node .render (context ).strip ())
85
+ setattr (self , attr , block_node .render (context ).strip ())
86
+
87
+ def _get_blocks (self , nodelist , context ):
88
+ blocks = {}
89
+ for node in nodelist :
90
+ if isinstance (node , ExtendsNode ):
91
+ parent = node .get_parent (context )
92
+ blocks .update (self ._get_blocks (parent .nodelist , context ))
93
+ blocks .update ({
94
+ node .name : node for node in nodelist .get_nodes_by_type (BlockNode )
95
+ })
96
+ return blocks
84
97
85
98
def _attach_body (self ):
86
99
if self .body and self .html :
0 commit comments