`BaseDetailView` and `SingleObjectMixin` optimization.
— at Version 10
Hi. In BaseDetailView.get(self, request, *args, **kwargs)
, we have line like context = self.get_context_data(object=self.object)
. Why should we pass object=self.object
? It's redundant (IMHO).
class SingleObjectMixin(ContextMixin):
def get_context_data(self, **kwargs):
"""Insert the single object into the context dict."""
context = {}
if self.object:
context['object'] = self.object
context_object_name = self.get_context_object_name(self.object)
if context_object_name:
context[context_object_name] = self.object
context.update(kwargs)
return super().get_context_data(**context)
class BaseDetailView(SingleObjectMixin, View):
"""A base view for displaying a single object."""
def get(self, request, *args, **kwargs):
self.object = self.get_object()
context = self.get_context_data(object=self.object)
return self.render_to_response(context)
I think, it's better idea to implement SingleObjectMixin.get_context_data(self, **kwargs)
and BaseDetailView.get(self, request, *args, **kwargs)
like this. Code below
class SingleObjectMixin(ContextMixin):
def get_context_data(self, *, object=None, **kwargs):
"""Insert the single object into the context dict."""
object = object if object is not None else self.object
context = {}
if object:
context['object'] = object
context_object_name = self.get_context_object_name(object)
if context_object_name:
context[context_object_name] = object
context.update(kwargs)
return super().get_context_data(**context)
class BaseDetailView(SingleObjectMixin, View):
"""A base view for displaying a single object."""
def get(self, request, *args, **kwargs):
self.object = self.get_object()
context = self.get_context_data()
return self.render_to_response(context)
Also, SingleObjectMixin
will be implemented in a same fashion as MultipleObjectMixin
is this moment.
https://github.com/django/django/pull/11654