Index: django/template/__init__.py
===================================================================
--- django/template/__init__.py	(revision 6783)
+++ django/template/__init__.py	(working copy)
@@ -311,6 +311,8 @@
         return NodeList()
 
     def extend_nodelist(self, nodelist, node, token):
+        if node.must_be_first and len(nodelist):
+            raise TemplateSyntaxError, "%r must be the first Node on the template." % node
         nodelist.append(node)
 
     def enter_command(self, command, token):
@@ -780,6 +782,9 @@
         return current
 
 class Node(object):
+    # Set this to True if the node must be the first on a NodeList.
+    must_be_first = False
+
     def render(self, context):
         "Return the node rendered as a string"
         pass
Index: django/template/loader_tags.py
===================================================================
--- django/template/loader_tags.py	(revision 6783)
+++ django/template/loader_tags.py	(working copy)
@@ -37,11 +37,16 @@
             self.parent = BlockNode(self.name, nodelist)
 
 class ExtendsNode(Node):
+    must_be_first = True
+
     def __init__(self, nodelist, parent_name, parent_name_expr, template_dirs=None):
         self.nodelist = nodelist
         self.parent_name, self.parent_name_expr = parent_name, parent_name_expr
         self.template_dirs = template_dirs
 
+    def __repr__(self):
+        return '<ExtendsNode: %s>' % self.parent_name
+
     def get_parent(self, context):
         if self.parent_name_expr:
             self.parent_name = self.parent_name_expr.resolve(context)
