Opened 5 years ago

Last modified 5 years ago

#30698 closed Cleanup/optimization

`BaseDetailView` and `SingleObjectMixin` optimization. — at Version 1

Reported by: Davit Gachechiladze Owned by: nobody
Component: Generic views Version: dev
Severity: Normal Keywords:
Cc: Triage Stage: Unreviewed
Has patch: yes Needs documentation: no
Needs tests: no Patch needs improvement: no
Easy pickings: no UI/UX: no

Description (last modified by Davit Gachechiladze)

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)

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). I think, it's better idea to implement SingleObjectMixin.get_context_data and BaseDetailView.get 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/gachdavit/django/pull/1

Change History (1)

comment:1 by Davit Gachechiladze, 5 years ago

Description: modified (diff)
Has patch: set
Note: See TracTickets for help on using tickets.
Back to Top