+class View(Entity):
+ nodes = generic.GenericRelation(Node, content_type_field='view_content_type', object_id_field='view_object_id')
+
+ accepts_subpath = False
+
+ def get_subpath(self, obj):
+ raise ViewDoesNotProvideSubpaths
+
+ def attributes_with_node(self, node):
+ return QuerySetMapper(self.attribute_set, passthrough=node.attributes)
+
+ def relationships_with_node(self, node):
+ return QuerySetMapper(self.relationship_set, passthrough=node.relationships)
+
+ def render_to_response(self, node, request, path=None, subpath=None, extra_context=None):
+ extra_context = extra_context or {}
+ view_about_to_render.send(sender=self, node=node, request=request, path=path, subpath=subpath, extra_context=extra_context)
+ response = self.actually_render_to_response(node, request, path, subpath, extra_context)
+ view_finished_rendering.send(sender=self, response=response)
+ return response
+
+ def actually_render_to_response(self, node, request, path=None, subpath=None, extra_context=None):
+ raise NotImplementedError('View subclasses must implement render_to_response.')
+
+ class Meta:
+ abstract = True
+
+
+_view_content_type_limiter.cls = View
+
+
+class MultiView(View):