#24689: DetailView get_template_name and get_context_object_name fail with deferred QuerySet ---------------------------------+------------------------------------ Reporter: BertrandBordage | Owner: nobody Type: Bug | Status: new Component: Generic views | Version: master Severity: Normal | Resolution: Keywords: | Triage Stage: Accepted Has patch: 1 | Needs documentation: 0 Needs tests: 1 | Patch needs improvement: 0 Easy pickings: 0 | UI/UX: 0 ---------------------------------+------------------------------------
Old description: > Suppose you define a view like this: > > {{{ > from django.views.generic import DetailView > from django.contrib.auth.models import User > > class UserDetail(DetailView): > model = User > queryset = User.objects.defer('password') > }}} > > If you try to use the view, the default template name is > {{{auth/user_deferred_password_detail.html}}} instead of > {{{auth/user_detail.html}}}. > > This is because Django creates a proxy model each time you use > defer/only. And therefore > {{{User.objects.defer('password')[0]._meta.model_name}}} is > {{{'user_deferred_password'}}}. > > {{{(DetailView|ListView).get_template_name}}} should ckeck if > {{{model._deferred}}} and use {{{model._meta.proxy_for_model}}} to get > the original model. New description: Suppose you define a view like this: {{{ from django.views.generic import DetailView from django.contrib.auth.models import User class UserDetail(DetailView): model = User queryset = User.objects.defer('password') }}} If you try to use the view, the default template name is {{{auth/user_deferred_password_detail.html}}} instead of {{{auth/user_detail.html}}}. This is because Django creates a proxy model each time you use defer/only. And therefore {{{User.objects.defer('password')[0]._meta.model_name}}} is {{{'user_deferred_password'}}}. {{{DetailView.get_template_name}}} should ckeck if {{{model._deferred}}} and use {{{model._meta.proxy_for_model}}} to get the original model. -- Comment (by BertrandBordage): Indeed, it’s not occurring using ListView. I assumed it would occur on it because I thought {{{User.objects.defer('password')}}} would be a queryset of the proxy model {{{User_Deferred_password}}}, but it’s not. It’s only once you get model instances that they use the proxy model. Sorry for not checking :( -- Ticket URL: <https://code.djangoproject.com/ticket/24689#comment:5> Django <https://code.djangoproject.com/> The Web framework for perfectionists with deadlines. -- You received this message because you are subscribed to the Google Groups "Django updates" group. To unsubscribe from this group and stop receiving emails from it, send an email to django-updates+unsubscr...@googlegroups.com. To post to this group, send email to django-updates@googlegroups.com. To view this discussion on the web visit https://groups.google.com/d/msgid/django-updates/073.39c914c98efb99bcdde7aed43b90e13b%40djangoproject.com. For more options, visit https://groups.google.com/d/optout.