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 :)

This work is under a Attribution-NonCommercial-NoDerivatives 4.0 International license.

Will you buy me a coffee?

You can use the terminal.

ssh customer@andros.dev -p 5555

Written by Andros Fenollosa

July 20, 2017

2 min of reading

You may also like