Skip to content

Commit

Permalink
adds fix for SingleObjectTemplateResponseMixin raising a TemplateDoes…
Browse files Browse the repository at this point in the history
…NotExist when it should have raised an ImproperlyConfigured. fixes 16502. by @ianawilson, @jambonrose
  • Loading branch information
ianawilson committed Sep 6, 2013
1 parent 630eb05 commit b79df0b
Show file tree
Hide file tree
Showing 3 changed files with 48 additions and 22 deletions.
50 changes: 28 additions & 22 deletions django/views/generic/detail.py
Expand Up @@ -137,28 +137,34 @@ def get_template_names(self):
# we just start with an empty list.
names = []

# If self.template_name_field is set, grab the value of the field
# of that name from the object; this is the most specific template
# name, if given.
if self.object and self.template_name_field:
name = getattr(self.object, self.template_name_field, None)
if name:
names.insert(0, name)

# The least-specific option is the default <app>/<model>_detail.html;
# only use this if the object in question is a model.
if isinstance(self.object, models.Model):
names.append("%s/%s%s.html" % (
self.object._meta.app_label,
self.object._meta.model_name,
self.template_name_suffix
))
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.model_name,
self.template_name_suffix
))
# If self.template_name_field is set, grab the value of the field
# of that name from the object; this is the most specific template
# name, if given.
if self.object and self.template_name_field:
name = getattr(self.object, self.template_name_field, None)
if name:
names.insert(0, name)

# The least-specific option is the default <app>/<model>_detail.html;
# only use this if the object in question is a model.
if isinstance(self.object, models.Model):
names.append("%s/%s%s.html" % (
self.object._meta.app_label,
self.object._meta.model_name,
self.template_name_suffix
))
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.model_name,
self.template_name_suffix
))

# If we still haven't managed to find any template names, we should
# re-raise the ImproperlyConfigured to alert the user.
if not names:
raise

return names


Expand Down
12 changes: 12 additions & 0 deletions tests/generic_views/test_base.py
Expand Up @@ -468,3 +468,15 @@ def test_overwrite_queryset(self):
# Overwrite the view's queryset with queryset from kwarg
context = test_view.get_context_data(object_list=queryset)
self.assertEqual(context['object_list'], queryset)


class SingleObjectTemplateResponseMixinTest(unittest.TestCase):

def test_create_view_with_form_only(self):
"""
We want to makes sure that if you use a template mixin, but forget the
template, it still tells you it's ImproperlyConfigured instead of
TemplateDoesNotExist.
"""
view = views.TemplateResponseWithoutTemplate()
self.assertRaises(ImproperlyConfigured, view.get_template_names)
8 changes: 8 additions & 0 deletions tests/generic_views/views.py
Expand Up @@ -92,6 +92,14 @@ class NaiveAuthorCreate(generic.CreateView):
fields = '__all__'


class TemplateResponseWithoutTemplate(generic.detail.SingleObjectTemplateResponseMixin, generic.View):
# we don't define the usual template_name here

def __init__(self):
# Dummy object, but attr is required by get_template_name()
self.object = None


class AuthorCreate(generic.CreateView):
model = Author
success_url = '/list/authors/'
Expand Down

0 comments on commit b79df0b

Please sign in to comment.