DEV Community

Gilbish
Gilbish

Posted on

Custom Context Processors in Django.

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')
Enter fullscreen mode Exit fullscreen mode

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} 

Enter fullscreen mode Exit fullscreen mode

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'
],
        },
    },
]
Enter fullscreen mode Exit fullscreen mode

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

Example:

<img src="{{bannerImage.image.url}}" alt=''/>
Enter fullscreen mode Exit fullscreen mode

Thanks For Reading my post.馃檪

Self-Promotion 馃榾

IllustrationHunt One place to look for sites offering free illustrations.

Discussion (4)

Collapse
alimp5 profile image
alimp5

Tnx a lot :X

Collapse
codephilanthropist profile image
Rian • Edited on

Thanks for this. I've read a lot of articles on how to extend my search form to all templates including the base.html. This one works best.

Collapse
gilbishkosma profile image
Gilbish Author

Thanks Rian, it really made my day 馃槃

Collapse
hiddenbycloak profile image
N谩h贸czki Tam谩s D.

Exactly what I needed! Thanks!