Navigation Menu

Skip to content

Commit

Permalink
Fixed django#16418 -- Made generic views work with ModelForms
Browse files Browse the repository at this point in the history
Generic views assumed any object's _meta will be model Options. This
is not true for ModelForms for example. Took isinstance(obj, Model)
in use instead.
  • Loading branch information
akaariai committed Jun 8, 2012
1 parent a035d9d commit 484fcd3
Show file tree
Hide file tree
Showing 4 changed files with 26 additions and 3 deletions.
7 changes: 4 additions & 3 deletions django/views/generic/detail.py
@@ -1,6 +1,7 @@
from __future__ import unicode_literals

from django.core.exceptions import ImproperlyConfigured, ObjectDoesNotExist
from django.db import models
from django.http import Http404
from django.utils.translation import ugettext as _
from django.views.generic.base import TemplateResponseMixin, ContextMixin, View
Expand Down Expand Up @@ -81,7 +82,7 @@ def get_context_object_name(self, obj):
"""
if self.context_object_name:
return self.context_object_name
elif hasattr(obj, '_meta'):
elif isinstance(obj, models.Model):
return obj._meta.object_name.lower()
else:
return None
Expand Down Expand Up @@ -128,13 +129,13 @@ def get_template_names(self):

# The least-specific option is the default <app>/<model>_detail.html;
# only use this if the object in question is a model.
if hasattr(self.object, '_meta'):
if isinstance(self.object, models.Model):
names.append("%s/%s%s.html" % (
self.object._meta.app_label,
self.object._meta.object_name.lower(),
self.template_name_suffix
))
elif hasattr(self, 'model') and hasattr(self.model, '_meta'):
elif hasattr(self, 'model') and self.model is not None and issubclass(self.model, models.Model):
names.append("%s/%s%s.html" % (
self.model._meta.app_label,
self.model._meta.object_name.lower(),
Expand Down
5 changes: 5 additions & 0 deletions tests/regressiontests/generic_views/detail.py
Expand Up @@ -92,3 +92,8 @@ def test_invalid_url(self):

def test_invalid_queryset(self):
self.assertRaises(ImproperlyConfigured, self.client.get, '/detail/author/invalid/qs/')

def test_non_model_object_with_meta(self):
res = self.client.get('/detail/nonmodel/1/')
self.assertEqual(res.status_code, 200)
self.assertEqual(res.context['object'].id, "non_model_1")
2 changes: 2 additions & 0 deletions tests/regressiontests/generic_views/urls.py
Expand Up @@ -53,6 +53,8 @@
views.AuthorDetail.as_view()),
(r'^detail/author/invalid/qs/$',
views.AuthorDetail.as_view(queryset=None)),
(r'^detail/nonmodel/1/$',
views.NonModelDetail.as_view()),

# Create/UpdateView
(r'^edit/artists/create/$',
Expand Down
15 changes: 15 additions & 0 deletions tests/regressiontests/generic_views/views.py
Expand Up @@ -226,3 +226,18 @@ class BookSigningTodayArchive(BookSigningConfig, generic.TodayArchiveView):

class BookSigningDetail(BookSigningConfig, generic.DateDetailView):
context_object_name = 'book'


class NonModel(object):
id = "non_model_1"

_meta = None


class NonModelDetail(generic.DetailView):

template_name = 'generic_views/detail.html'
model = NonModel

def get_object(self, queryset=None):
return NonModel()

0 comments on commit 484fcd3

Please sign in to comment.