Let's say you have a file structure like this for your Django project:
├───project
│ ├───__init__.py
│ ├───asgi.py
│ ├───settings.py
│ ├───urls.py
│ └───wsgi.py
├───.env
├───manage.py
└───db.sqlite3
1) Create a context_processors.py file in the project folder (along with settings.py):
It can be put anywhere in Django project but I think here is a good place to put.
├───project
│ ├───__init__.py
│ ├───asgi.py
│ ├───context_processors.py
│ ├───settings.py
│ ├───urls.py
│ └───wsgi.py
├───.env
├───manage.py
└───db.sqlite3
2) Create a function in context_processors.py that accepts a HttpRequest object as an argument and returns a dictionary. A context processor is just a function that accepts an HttpRequest object as an argument and returns a dictionary.
@project/context_processors.py
from blog.models import Cat, Post
def context_for_every_template(request):
cats = Cat.objects.all()
featured_posts = Post.objects.filter(featured=True)
latest_posts = Post.objects.all()[:4]
context = {
'cats': cats,
'featured_posts': featured_posts,
'latest_posts': latest_posts,
}
return context
3) Add this to your context_processors setting in settings.py (at the bottom for security reasons):
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [BASE_DIR / 'config' / 'templates'],
'APP_DIRS': True,
'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',
'project.context_processors.context_for_every_template', # Add it here
],
},
},
]
Now you'll be able to access the 'cats', 'featured_posts' and 'latest_posts' template variables on every single django template across your whole site.