diff --git a/django/views/generic/detail.py b/django/views/generic/detail.py
index a2adb15..06118a9 100644
--- a/django/views/generic/detail.py
+++ b/django/views/generic/detail.py
@@ -58,8 +58,9 @@ class SingleObjectMixin(ContextMixin):
         `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 "
@@ -93,6 +94,9 @@ class SingleObjectMixin(ContextMixin):
         context.update(kwargs)
         return super(SingleObjectMixin, self).get_context_data(**context)
 
+    def get_model(self):
+        return self.model
+
 
 class BaseDetailView(SingleObjectMixin, View):
     def get(self, request, *args, **kwargs):
@@ -133,12 +137,14 @@ class SingleObjectTemplateResponseMixin(TemplateResponseMixin):
                 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
index 1f488cb..33eafe7 100644
--- a/django/views/generic/edit.py
+++ b/django/views/generic/edit.py
@@ -72,17 +72,7 @@ class ModelFormMixin(FormMixin, SingleObjectMixin):
         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):
@@ -118,6 +108,16 @@ class ModelFormMixin(FormMixin, SingleObjectMixin):
                 context[context_object_name] = self.object
         context.update(kwargs)
         return super(ModelFormMixin, self).get_context_data(**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
index 651e14f..90cbe04 100644
--- a/tests/regressiontests/generic_views/edit.py
+++ b/tests/regressiontests/generic_views/edit.py
@@ -87,6 +87,21 @@ class CreateViewTests(TestCase):
         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
index a78242f..3d7079e 100644
--- a/tests/regressiontests/generic_views/forms.py
+++ b/tests/regressiontests/generic_views/forms.py
@@ -2,7 +2,7 @@ from __future__ import absolute_import
 
 from django import forms
 
-from .models import Author
+from .models import Author, Artist
 
 
 class AuthorForm(forms.ModelForm):
@@ -11,3 +11,10 @@ class AuthorForm(forms.ModelForm):
 
     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
index 090ec73..93c49d4 100644
--- a/tests/regressiontests/generic_views/urls.py
+++ b/tests/regressiontests/generic_views/urls.py
@@ -56,6 +56,8 @@ urlpatterns = patterns('',
     # 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
index 1e70ba4..25c80b3 100644
--- a/tests/regressiontests/generic_views/views.py
+++ b/tests/regressiontests/generic_views/views.py
@@ -6,7 +6,7 @@ from django.core.urlresolvers import reverse
 from django.utils.decorators import method_decorator
 from django.views import generic
 
-from .forms import AuthorForm
+from .forms import AuthorForm, ArtistForm
 from .models import Artist, Author, Book, Page
 
 
@@ -78,6 +78,9 @@ class AuthorListCustomPaginator(AuthorList):
 class ArtistCreate(generic.CreateView):
     model = Artist
 
+class ArtistOnlyFormClassCreate(generic.CreateView):
+    form_class = ArtistForm
+
 
 class NaiveAuthorCreate(generic.CreateView):
     queryset = Author.objects.all()
