=== added directory 'tests/modeltests/get_object_or_404'
=== added file 'tests/modeltests/get_object_or_404/__init__.py'
=== added file 'tests/modeltests/get_object_or_404/models.py'
--- tests/modeltests/get_object_or_404/models.py	1970-01-01 00:00:00 +0000
+++ tests/modeltests/get_object_or_404/models.py	2006-12-27 05:17:30 +0000
@@ -0,0 +1,62 @@
+"""
+36. get_object_or_404()
+
+get_object_or_404 is a shortcut function to be used in view functions for
+performing a get() lookup and raising a Http404 exception if a DoesNotExist
+exception was rasied during the get() call.
+"""
+
+from django.db import models
+from django.http import Http404
+from django.shortcuts import get_object_or_404
+
+class Author(models.Model):
+    name = models.CharField(maxlength=50)
+    
+    def __str__(self):
+        return self.name
+
+class ArticleManager(models.Manager):
+    def get_query_set(self):
+        return super(ArticleManager, self).get_query_set().filter(author__name__icontains='sir')
+
+class Article(models.Model):
+    author = models.ForeignKey(Author)
+    title = models.CharField(maxlength=50)
+    objects = models.Manager()
+    by_a_sir = ArticleManager()
+    
+    def __str__(self):
+        return "%s by %s" % (self.title, self.author)
+
+__test__ = {'API_TESTS':"""
+# Let's create an Author.
+>>> a = Author.objects.create(name="Brave Sir Robin")
+
+# No Articles yet so we should get a Http404 error.
+>>> get_object_or_404(Article, title="Foo") == Http404
+Traceback (most recent call last):
+...
+Http404
+
+# Let's create an Article.
+>>> article = Article.objects.create(author=a, title="Run away!")
+
+# get_object_or_404 can be passed a Model to query.
+>>> get_object_or_404(Article, title__contains="Run")
+<Article: Run away! by Brave Sir Robin>
+
+# We can also use the the Article manager through an Author object.
+>>> get_object_or_404(a.article_set, title__contains="Run")
+<Article: Run away! by Brave Sir Robin>
+
+# No articles containing "Camelot".  This should raise a Http404 error.
+>>> get_object_or_404(a.article_set, title__contains="Camelot")
+Traceback (most recent call last):
+...
+Http404
+
+# Custom managers can be used too.
+>>> get_object_or_404(Article.by_a_sir, title="Run away!")
+<Article: Run away! by Brave Sir Robin>
+"""}

=== modified file 'django/shortcuts/__init__.py'
--- django/shortcuts/__init__.py	2006-12-19 04:35:09 +0000
+++ django/shortcuts/__init__.py	2006-12-25 06:24:58 +0000
@@ -4,6 +4,7 @@
 
 from django.template import loader
 from django.http import HttpResponse, Http404
+from django.db.models.manager import Manager
 
 
 def render_to_response(*args, **kwargs):
@@ -11,13 +12,22 @@
 load_and_render = render_to_response # For backwards compatibility.
 
 def get_object_or_404(klass, *args, **kwargs):
+    if isinstance(klass, Manager):
+        manager = klass
+        klass = manager.model
+    else:
+        manager = klass._default_manager
     try:
-        return klass._default_manager.get(*args, **kwargs)
+        return manager.get(*args, **kwargs)
     except klass.DoesNotExist:
         raise Http404
 
 def get_list_or_404(klass, *args, **kwargs):
-    obj_list = list(klass._default_manager.filter(*args, **kwargs))
+    if isinstance(klass, Manager):
+        manager = klass
+    else:
+        manager = klass._default_manager
+    obj_list = list(manager.filter(*args, **kwargs))
     if not obj_list:
         raise Http404
     return obj_list

