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.
Example:
<img src="{{bannerImage.image.url}}" alt=''/>
Thanks For Reading my post.🙂
Self-Promotion 😀
IllustrationHunt One place to look for sites offering free illustrations.
Top comments (3)
Tnx a lot :X
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.
Thanks Rian, it really made my day 😄