Saltar a contenido
 No os perd谩is mi futuro contenido, seguidme en y Youtube 馃榿

Procesadores de contexto

As铆 que tenemos que recuperar los enlaces sociales para enviarlos a todas las p谩ginas鈥 驴Habr谩 alguna forma que nos permita hacerlo una vez y que funcione en todos los templates? 隆Pues s铆! De hecho hay m谩s de una, pero para este caso la m谩s 贸ptima es crear un procesador de contexto.

驴Qu茅 es un procesador de contexto? Pues es una forma de extender el contexto, aunque de poco sirve decirlo si no sabemos antes qu茅 es el contexto.

驴Record谩is el diccionario que enviamos desde nuestras vistas a los templates? Bueno, ese diccionario lo que hace es extender el contexto, por lo que podemos entender que se trata de una especie de diccionario com煤n, que existe incluso sin enviar ning煤n dato desde una vista. As铆 que blanco y en botella, si logramos extender ese contexto global y a帽adir los enlaces de nuestras redes, entonces podremos mostrarlas en cualquier template sin necesidad de enviarlas desde una vista.

Para crear un procesador de contexto vamos a crear un nuevo fichero llamado processors.py en nuestra app Social:

Dentro vamos a definir una funci贸n que devuelva un diccionario de la siguiente forma:

Note

def ctx_dict(request):
    ctx = {'test':'hola'}
    return ctx  

Nuestro objetivo es que este diccionario extienda el contexto global, de manera que podamos utilizar la clave 鈥榯est鈥 como una variable en cualquier template. Para lograrlo debemos ir a settings, buscar el apartado context_processors en el diccionario TEMPLATES dentro de la clave OPTIONS y a帽adirlo al final:

Note

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',
                'social.processors.ctx_dict'   # <====
            ],
        },
    },
]

Si ahora vamos por ejemplo a base.html y mostramos la variable {{test}} en el pie de p谩gina:

Note

<footer class="footer text-faded text-center py-5">
    <div class="container">
        {{test}}
        ...
    </div>
</footer>

Si actualizamos la web, veremos que aparece "Hola" en todas las p谩ginas.

Por tanto ya tenemos la base, s贸lo debemos a帽adir al diccionario las redes:

Note

from .models import Link

def ctx_dict(request):
    ctx = {}
    links = Link.objects.all()
    for link in links:
        ctx[link.key] = link.url
    return ctx

Y mostrarlas en el template:

Note

<p class="m-0">
    {% if LINK_TWITTER %}
    <a href="{{LINK_TWITTER}}" class="link">
        <span class="fa-stack fa-lg">
        <i class="fa fa-circle fa-stack-2x"></i>
        <i class="fa fa-twitter fa-stack-1x fa-inverse"></i>
        </span>
    </a>
    {% endif %}
    {% if LINK_FACEBOOK %}
    <a href="{{LINK_FACEBOOK}}" class="link">
        <span class="fa-stack fa-lg">
        <i class="fa fa-circle fa-stack-2x"></i>
        <i class="fa fa-facebook fa-stack-1x fa-inverse"></i>
        </span>
    </a>
    {% endif %}
    {% if LINK_INSTAGRAM %}
    <a href="{{LINK_INSTAGRAM}}" class="link">
        <span class="fa-stack fa-lg">
        <i class="fa fa-circle fa-stack-2x"></i>
        <i class="fa fa-instagram fa-stack-1x fa-inverse"></i>
        </span>
    </a>
    {% endif %}
</p>

Sin duda una t茅cnica extensible y elegante, digna de unos buenos profesionales.


脷ltima edici贸n: 31 de Octubre de 2018