8000 Fixed #24689 -- Fixed DetailView methods with deferred QuerySet. · ddriddle/django@86aaffa · GitHub
[go: up one dir, main page]

Skip to content

Commit 86aaffa

Browse files
artis101timgraham
authored andcommitted
Fixed #24689 -- Fixed DetailView methods with deferred QuerySet.
1 parent 0f2e82b commit 86aaffa

File tree

2 files changed

+29
-2
lines changed

2 files changed

+29
-2
lines changed

django/views/generic/detail.py

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -89,6 +89,8 @@ def get_context_object_name(self, obj):
8989
if self.context_object_name:
9090
return self.context_object_name
9191
elif isinstance(obj, models.Model):
92+
if self.object._deferred:
93+
obj = obj._meta.proxy_for_model
9294
return obj._meta.model_name
9395
else:
9496
return None
@@ -149,9 +151,12 @@ def get_template_names(self):
149151
# The least-specific option is the default <app>/<model>_detail.html;
150152
# only use this if the object in question is a model.
151153
if isinstance(self.object, models.Model):
154+
object_meta = self.object._meta
155+
if self.object._deferred:
156+
object_meta = self.object._meta.proxy_for_model._meta
152157
names.append("%s/%s%s.html" % (
153-
self.object._meta.app_label,
154-
self.object._meta.model_name,
158+
object_meta.app_label,
159+
object_meta.model_name,
155160
self.template_name_suffix
156161
))
157162
elif hasattr(self, 'model') and self.model is not None and issubclass(self.model, models.Model):

tests/generic_views/test_detail.py

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,10 @@
55

66
from django.core.exceptions import ImproperlyConfigured, ObjectDoesNotExist
77
from django.test import TestCase, override_settings
8+
from django.test.client import RequestFactory
89
from django.views.generic.base import View
10+
from django.views.generic.detail import SingleObjectTemplateResponseMixin
11+
from django.views.generic.edit import ModelFormMixin
912

1013
from .models import Artist, Author, Book, Page
1114

@@ -137,6 +140,25 @@ def test_duplicated_context_object_name(self):
137140
self.assertNotIn('author', res.context)
138141
self.assertTemplateUsed(res, 'generic_views/author_detail.html')
139142

143+
def test_deferred_queryset_template_name(self):
144+
class FormContext(SingleObjectTemplateResponseMixin):
145+
request = RequestFactory().get('/')
146+
model = Author
147+
object = Author.objects.defer('name').get(pk=self.author1.pk)
148+
149+
self.assertEqual(FormContext().get_template_names()[0], 'generic_views/author_detail.html')
150+
151+
def test_deferred_queryset_context_object_name(self):
152+
class FormContext(ModelFormMixin):
153+
request = RequestFactory().get('/')
154+
model = Author
155+
object = Author.objects.defer('name').get(pk=self.author1.pk)
156+
fields = ('name',)
157+
158+
form_context_data = FormContext().get_context_data()
159+
self.assertEqual(form_context_data['object'], self.author1)
160+
self.assertEqual(form_context_data['author'], self.author1)
161+
140162
def test_invalid_url(self):
141163
self.assertRaises(AttributeError, self.client.get, '/detail/author/invalid/url/')
142164

0 commit comments

Comments
 (0)
0