2021 Gilbish Kosma

Custom Context Processor in Django.

what's context processor and how to use it?

django context

What's the need of context processors? 😇

Sometimes you want to make a variable accessible to all templates in a project.

Two ways to access a variable in all templates:
1. Hard Way: By providing the same variable in the context of each view. 😐
2. Easy Way: creating a custom context processor 😋

Personally I don't like the hard way, cause then I have to write the same code in each view.

Let's see how it can be done the easy way.

Consider a situation where you need to display a banner image in each page of your website, the banner image will be fetched from the database.

Model for the banner image:

#models.py class BannerImage(models.Model): image = models.ImageField(upload_to='img')

We can access the banner image in each page using the context processor.

Write Custom Context Processor 🙌

Create a new file context_processors.py inside your app and write a function which will return a dictionary containing the variable we want to use.

#context_processors.py from .models import BannerImage def access_banner_image(request): """ The context processor must return a dictionary. """ bannerImage = BannerImage.objects.latest('-id') #query the latest banner image return {'bannerImage':bannerImage}

access_banner_image is the custom context processors we just created, add it to the context_processors option in the TEMPLATES setting so that the variable bannerImage is accessible in all templates.

#settings.py TEMPLATES = [ { #under OPTIONS key 'OPTIONS': { 'context_processors': [ 'django.template.context_processors.debug', 'django.template.context_processors.request', 'django.contrib.auth.context_processors.auth', 'django.contrib.messages.context_processors.messages', #context processor written by us. 'appname.context_processors.access_banner_image' ], }, }, ]

We are done 🎉 , the bannerImage variable will be now accessible in all the templates.


<img src="{{bannerImage.image.url}}" alt=''/>

Thanks For Reading my post.🙂