Django - Como tener la misma variable en todas las plantillas

En alguna ocasión te preguntarás como tener la misma variable en todas las plantillas en Django. O lo que es lo mismo, poseer una variable presente en todas las templates de tu web con Django. En este tutorial te enseñaré los pasos lo más anemo que me sea posible.

En el ejemplo supondré que quiero tener en todas mis plantillas una lista con los planetas de nuestro sistema solar.

Paso 1

Creamos un fichero dentro de nuestra aplicación con el nombre context_processors.py.

Supongamos que mi aplicación se llama universo y lo tengo dentro de una carpeta llamada apps.

touch apps/universo/context_processors.py

Paso 2

Dentro del nuevo fichero de Python pegaremos el siguiente fragmento:

def mis_variables(request):
    planetas = ('mercurio', 'venus', 'tierra', 'marte')
    return {'planetas': planetas}

Paso 3

En settings.py, añadimos un nuevo context_processors:. Que es una OPTIONS de TEMPLATES.

En mi ejemplo, pasaría de tener esto:

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [os.path.join(BASE_DIR, 'apps/universo/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',
            ],
            'builtins': [
                'django.contrib.staticfiles.templatetags.staticfiles',
                'django.templatetags.i18n',
            ],
        },
    },
]

a esto

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [os.path.join(BASE_DIR, 'apps/universo/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',
                'apps.universo.context_processors.mis_variables',
            ],
            'builtins': [
                'django.contrib.staticfiles.templatetags.staticfiles',
                'django.templatetags.i18n',
            ],
        },
    },
]

Paso 4

En estos momentos ya podremos utilizar la variable. Da lo mismo si es un layout o un hijo, estará presente en cada HTML que renderices.

<html>         
    <body>
        <ul>
        {% for planeta in planetas %}
            <li>{{ planeta }}</li>
        {% endfor %}
        </ul>
    </body>
</html>         

Paso 5

Dejen un comentario si les ha gustado :)

Versión escritorio