Simplemente Django: Anuncios

simply-django-announcements

Una vez que se tiene un sitio web en producción, aparecen nuevas necesidades.

Un ejemplo, en nuestro caso, es enviar información a nuestros usuarios acerca de alguna actualización o mantenimiento en la aplicación. 

Ante tal necesidad, identificamos dos enfoques posibles :

  1. Crear un sistema de notificación y enviar la información a cada bandeja de entrada.
  2. Crear un anuncio global y mostrarlo en cualquier lugar.

El primero es útil para cuando los usuarios necesitan saber algo y no pueden perder la información. Por tanto, contarán con una bandeja de entrada en la aplicación, que resaltará el anuncio hasta ser leído. 

El segundo caso es más sencillo aún, puesto que necesitamos informar a nuestros usuarios sobre algo que está sucediendo o sucederá pronto. El nombre de dicho enfoque es anuncios globales y consiste en aquel mensaje que los usuarios activos pueden ver sin que se genere una notificación. 

Por tal motivo, esta publicación trata sobre cómo una aplicación simple como Django nos permite manejar Anuncios Globales.

Fácil de Agregar: Crear un modelo y manejarlo desde el administrador

Queremos que nuestros anuncios sean fáciles de crear y mostrar. Con esto en mente, podemos crear un modelo y utilizar el poderoso administrador de Django.

El modelo debe ser bastante simple y en su núcleo necesita un contenido, una bandera para saber si es visible y la gravedad del mensaje.

Por tanto, terminaríamos con algo como:

desde modelos de importación django.db 
OPCIONES_NIVEL = ( 
     ('advertencia', 'Advertencia'), 
     ('error', 'Error'), 
     ('éxito', 'éxito'), 
     ('información', 'Información'), 
) 
Anuncio de clase (modelos.Modelo): 
    """ 
    Modelo para realizar anuncios globales 
    """ 
    modelos cuerpo = modelos.TextField(en blanco=Falso) 
    mostrar =.BooleanField(predeterminado=Falso) 
    nivel =.CharField(max_length= 7, 
                opciones=LEVEL_CHOICES, predeterminado='info') 

    def __unicode__(uno mismo): 
        volver auto.cuerpo[:50]

Para la parte de administración, podemos usar los valores predeterminados para que sea simple.

El único detalle adicional que agregaremos es la información a la lista de objetos, para que sea más fácil conocer el estado de los anuncios.

desde django.contrib administrador de importación 
de .models import Anuncio


@admin.registrar(Anuncio) 
clase AnnouncementAdmin(admin.ModelAdmin): 
    list_display = ('cuerpo', 'nivel', 'pantalla')

Fácil de Acceder: Procesador de Contexto

Queremos un anuncio global que se realice fácilmente con el procesador de contexto de Django, que agregue lo que queramos al contexto de cada solicitud en nuestra aplicación.

Para ello, primero creamos nuestro procesador de contexto, que recupera todos los mensajes que se muestran.

Solo necesitamos crear un archivo context_processors.py en nuestra aplicación:

de .models import Anuncio


def anuncio_contexto_procesador(solicitud): 
    """ 
    Agrega los anuncios activos al contexto. 
    """ 
    devolver { 
        'anuncios': Anuncio.objetos.filtro(display=True)
    }

De igual modo, añadimos a este procesador de contexto a nuestra configuración:

PLANTILLA_CONTEXTO_PROCESADORES = ( 
    # Sus otros procesadores de contexto 
    path.to.context_processors.announcement_context_processor,
)

Lo anterior es todo lo que necesitamos para tener nuestros anuncios en cada solicitud.

Todo lo que queda por hacer ahora es mostrarlos.

Rápido de mostrar: Plantilla Django

Para mostrar nuestros nuevos anuncios globales, debemos agregarlos a nuestra plantilla base, del siguiente modo:

{% para anuncio en anuncios %} 
  <div class="alerta alerta-{{ anuncio.nivel }}">{{ anuncio.cuerpo|seguro }} </div> 
{% endfor%}

Note que usamos las clases de bootstrap para alerta. Con ello logramos cambiar la forma en que se muestran los mensajes en función de la gravedad del mensaje. Puede agregarles o cualquier clase que desee aquí.

Por otro lado, es importante tener en cuenta que utilizamos el filtro seguro para el cuerpo de nuestro anuncio.

El filtro seguro permite usar el html de nuestro backend en caso de que queramos agregar enlaces o algún otro html a nuestros mensajes, pero si no cree necesitarlo, puede eliminarlo.

Hasta aquí hay dos advertencias.

La primera es que no debemos usar el anuncio de nombre en ningún contexto, ya que se anulará en nuestro procesador de contexto. Solo algo a tener en cuenta al nombrar sus datos de contexto.

La segunda, que requiere más atención, es que el procesador de contexto recibe todas las solicitudes y tiene una consulta de base de datos.

Por lo tanto, usaremos nuestra base de datos con bastante frecuencia para obtener datos que no cambiarán.

Afortunadamente, esto es bastante fácil de solucionar, con el siguiente ¡caché al rescate!:

{% caché 300 anuncios_caché %} {% si anuncios %} {% para anuncio en anuncios %} <div class="alert alerta-{{ anuncio.nivel }}">{{ anuncio.cuerpo|seguro }}</div > {% endfor %} {% endif %} {% endcache %}

Nuestro fragmento de plantilla se almacenará en caché y llegará a la base de datos una vez cada cinco minutos. 

Siéntete libre de jugar con el tiempo si crees que no es suficiente o demasiado.

Conclusiones: 

  1. Tenemos un sistema simple para anuncios globales, lo que permite enviar información a nuestros usuarios.
  2. Se puede editar desde el backend y es lo suficientemente simple como para ser entendido incluso por personal no técnico.
  3. Existen varias aplicaciones de terceros que pueden hacerlo, pero a veces pueden ser excesivas. Por lo que si se necesita un proceso simple, el proceso presentado en este blog es ideal.