[Django]-Django Generic Views :How does DetailView automatically provides the variable to the template ??

4👍

If you check the implementation of get_context_name(), you’ll see this:

def get_context_object_name(self, obj):
    """
    Get the name to use for the object.
    """
    if self.context_object_name:
        return self.context_object_name
    elif isinstance(obj, models.Model):
        return obj._meta.model_name
    else:
        return None

And the implementation for get_context_data() (from SingleObjectMixin):

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(SingleObjectMixin, self).get_context_data(**context)

So you can see that get_context_data() adds to the dictionary an entry with the key context_object_name (from get_context_object_name()) which returns obj._meta.model_name when self.context_object_name isn’t defined. In this case, the view got self.object as a consequence of the call to get() which calls get_object(). get_object() takes the model that you’ve defined and automatically queries it from your database using the pk you’ve defined in your urls.py file.

http://ccbv.co.uk/ is a very good website for seeing all of the functions and attributes the class based views of Django has to offer in a single page.

👤Chuck

0👍

This can be helpful where if context_object_name is not set, the context name will be constructed from the model_name of the model that the queryset is composed from

https://docs.djangoproject.com/en/3.1/ref/class-based-views/mixins-single-object/#django.views.generic.detail.SingleObjectMixin.get_context_object_name

Leave a comment