diff --git a/django/template/loader.py b/django/template/loader.py
--- a/django/template/loader.py
+++ b/django/template/loader.py
@@ -179,6 +179,9 @@
 
 def select_template(template_name_list):
     "Given a list of template names, returns the first that can be loaded."
+    if not template_name_list:
+        raise ValueError("Couldn't choose template for load since there are"
+                         " no candidates")
     not_found = []
     for template_name in template_name_list:
         try:
diff --git a/django/views/generic/detail.py b/django/views/generic/detail.py
--- a/django/views/generic/detail.py
+++ b/django/views/generic/detail.py
@@ -58,8 +58,9 @@
         `get_object` is overridden.
         """
         if self.queryset is None:
-            if self.model:
-                return self.model._default_manager.all()
+            model = self.get_model()
+            if model:
+                return model._default_manager.all()
             else:
                 raise ImproperlyConfigured(u"%(cls)s is missing a queryset. Define "
                                            u"%(cls)s.model, %(cls)s.queryset, or override "
@@ -92,6 +93,9 @@
             context[context_object_name] = self.object
         return context
 
+    def get_model(self):
+        return self.model
+
 
 class BaseDetailView(SingleObjectMixin, View):
     def get(self, request, **kwargs):
@@ -132,12 +136,14 @@
                 self.object._meta.object_name.lower(),
                 self.template_name_suffix
             ))
-        elif hasattr(self, 'model') and hasattr(self.model, '_meta'):
-            names.append("%s/%s%s.html" % (
-                self.model._meta.app_label,
-                self.model._meta.object_name.lower(),
-                self.template_name_suffix
-            ))
+        elif hasattr(self, 'get_model'):
+            model = self.get_model()
+            if hasattr(model, '_meta'):
+                names.append("%s/%s%s.html" % (
+                    model._meta.app_label,
+                    model._meta.object_name.lower(),
+                    self.template_name_suffix
+                ))
         return names
 
 
diff --git a/django/views/generic/edit.py b/django/views/generic/edit.py
--- a/django/views/generic/edit.py
+++ b/django/views/generic/edit.py
@@ -75,17 +75,7 @@
         if self.form_class:
             return self.form_class
         else:
-            if self.model is not None:
-                # If a model has been explicitly provided, use it
-                model = self.model
-            elif hasattr(self, 'object') and self.object is not None:
-                # If this view is operating on a single object, use
-                # the class of that object
-                model = self.object.__class__
-            else:
-                # Try to get a queryset and extract the model class
-                # from that
-                model = self.get_queryset().model
+            model = self.get_model()
             return model_forms.modelform_factory(model)
 
     def get_form_kwargs(self):
@@ -120,6 +110,16 @@
             if context_object_name:
                 context[context_object_name] = self.object
         return context
+        
+    def get_model(self):
+        if self.model:
+            return self.model
+        elif self.form_class and issubclass(self.form_class, model_forms.ModelForm):
+            return self.form_class._meta.model
+        elif hasattr(self, 'object') and self.object is not None:
+            return self.object.__class__
+        else:
+            return self.get_queryset().model
 
 
 class ProcessFormView(View):
diff --git a/tests/regressiontests/generic_views/edit.py b/tests/regressiontests/generic_views/edit.py
--- a/tests/regressiontests/generic_views/edit.py
+++ b/tests/regressiontests/generic_views/edit.py
@@ -75,6 +75,21 @@
         self.assertRedirects(res, reverse('author_detail', kwargs={'pk': obj.pk}))
         self.assertQuerysetEqual(Author.objects.all(), ['<Author: Randall Munroe>'])
 
+    def test_create_with_only_form_class(self):
+        res = self.client.get('/edit/artists/create/formclass/')
+        self.assertEqual(res.status_code, 200)
+        self.assertTrue(isinstance(res.context['form'], views.ArtistForm))
+        self.assertFalse('object' in res.context)
+        self.assertFalse('artist' in res.context)
+        self.assertTemplateUsed(res, 'generic_views/artist_form.html')
+        
+        res = self.client.post('/edit/artists/create/formclass/',
+                               {'name': 'Rene Magritte'})
+        self.assertEqual(res.status_code, 302)
+        artist = Artist.objects.get(name='Rene Magritte')
+        self.assertRedirects(res, 'http://testserver/detail/artist/%d/' % artist.pk)
+        self.assertQuerysetEqual(Artist.objects.all(), ['<Artist: Rene Magritte>'])
+
     def test_create_without_redirect(self):
         try:
             res = self.client.post('/edit/authors/create/naive/',
diff --git a/tests/regressiontests/generic_views/forms.py b/tests/regressiontests/generic_views/forms.py
--- a/tests/regressiontests/generic_views/forms.py
+++ b/tests/regressiontests/generic_views/forms.py
@@ -1,6 +1,6 @@
 from django import forms
 
-from regressiontests.generic_views.models import Author
+from regressiontests.generic_views.models import Author, Artist
 
 
 class AuthorForm(forms.ModelForm):
@@ -9,3 +9,10 @@
 
     class Meta:
         model = Author
+
+
+class ArtistForm(forms.ModelForm):
+    name = forms.CharField()
+
+    class Meta:
+        model = Artist
diff --git a/tests/regressiontests/generic_views/urls.py b/tests/regressiontests/generic_views/urls.py
--- a/tests/regressiontests/generic_views/urls.py
+++ b/tests/regressiontests/generic_views/urls.py
@@ -54,6 +54,8 @@
     # Create/UpdateView
     (r'^edit/artists/create/$',
         views.ArtistCreate.as_view()),
+    (r'^edit/artists/create/formclass/$',
+        views.ArtistOnlyFormClassCreate.as_view()),
     (r'^edit/artists/(?P<pk>\d+)/update/$',
         views.ArtistUpdate.as_view()),
 
diff --git a/tests/regressiontests/generic_views/views.py b/tests/regressiontests/generic_views/views.py
--- a/tests/regressiontests/generic_views/views.py
+++ b/tests/regressiontests/generic_views/views.py
@@ -5,7 +5,7 @@
 from django.views import generic
 
 from regressiontests.generic_views.models import Artist, Author, Book, Page
-from regressiontests.generic_views.forms import AuthorForm
+from regressiontests.generic_views.forms import AuthorForm, ArtistForm
 
 
 class CustomTemplateView(generic.TemplateView):
@@ -77,6 +77,9 @@
 class ArtistCreate(generic.CreateView):
     model = Artist
 
+class ArtistOnlyFormClassCreate(generic.CreateView):
+    form_class = ArtistForm
+
 
 class NaiveAuthorCreate(generic.CreateView):
     queryset = Author.objects.all()
diff --git a/tests/regressiontests/templates/loaders.py b/tests/regressiontests/templates/loaders.py
--- a/tests/regressiontests/templates/loaders.py
+++ b/tests/regressiontests/templates/loaders.py
@@ -143,5 +143,11 @@
         self.assertEqual(output, 'obj:after')
         self.assertEqual(context['obj'], 'before')
 
+    def test_empty_list(self):
+        self.assertRaises(ValueError, loader.render_to_string, [])
+
+    def test_select_templates_from_empty_list(self):
+        self.assertRaises(ValueError, loader.select_template, [])
+
 if __name__ == "__main__":
     unittest.main()
