Custom context processors in Django

Posted by Tobiasz Kedzierski on 15.01.2019

Custom context processors in Django

In order to get the content out of database in the template the best way is usually a template tag (you can write your own template tags). However, when you want a particular variable to be available in the context of every template, creating a custom context processor could be a convenient way to achieve this. If you have ever used {% request %} or {% debug %} you can easily wrap your head around this concept.

First, we write simple context processors.

# my_app/my_context_processor.py
from datetime import datetime


def custom_context(request):
    return {"hello": "Hello World!"}


def another_custom_context(request):
    right_now = datetime.now().strftime("%b %d %Y %H:%M:%S")
    return {
        "bye": "Bye Bye!",
        "bye_user": f"Bye Bye {request.user}!",
        "right_now": right_now,
    }

Next, go to settings.py and append the context processors to the context_processors list in the templates options.

# mysite/settings.py
TEMPLATES = [
    {
        "BACKEND": "django.template.backends.django.DjangoTemplates",
        "DIRS": [],
        "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",
                # add your custom context processors here
                "my_app.my_context_processor.custom_context"
                "my_app.my_context_processor.another_custom_context",
            ],
        },
    },
]

And there we are. We can enjoy our custom context processors!

{# myapp/templates/myapp/page.html #}
<p> {{ hello }} <p>
<p> {{ bye }} <p>
<p> {{ bye_user }} <p>
<p> Right now: {{ right_now }} <p>

They will be rendered as below.

<p> Hello World! <p>
<p> Bye Bye! <p>
<p> Bye Bye AnonymousUser! <p>
<p> Right now: Jan 05 2019 18:10:25 <p>



Sources:

tags: python, django