Kitabı oku: «Django 2», sayfa 6

Yazı tipi:

Resumen

En este capítulo ha aprendido cómo funcionan los formularios estándar de Django así como los formularios de modelo. Ha creado un sistema para compartir contenido del sitio web por email y otro para realizar comentarios. Añadió el etiquetado a los artículos del blog, integrando una aplicación, y construyó consultas complejas para recuperar objetos por similitud.

En el siguiente capítulo aprenderá a crear filtros y etiquetas de plantilla personalizados. También construirá un mapa del sitio y creará contenido para el blog. Por último, implementará un sistema de búsqueda de texto.

3
Extensiones para el blog

En el capítulo anterior vio los conceptos básicos de formularios y aprendió cómo integrar aplicaciones de terceros en el proyecto. En este capítulo se cubrirán los siguientes puntos:

• Crear filtros y etiquetas de plantilla personalizados.

• Añadir un mapa del sitio y un sistema de feeds de artículos.

• Implementar un sistema de búsqueda de texto con PostgreSQL.

Crear filtros y etiquetas de plantilla personalizados

Django ofrece, en el propio paquete, una gran variedad de etiquetas de plantilla como {% if %} o {% block %}. Algunas de estas ya las ha utilizado anteriormente, pero un listado más completo se puede obtener accediendo a https://docs.djangoproject.com/en/2.0/ref/templates/builtins/.

Sin embargo, Django ofrece la posibilidad de crear sus propias etiquetas de plantilla para realizar acciones específicas. Las etiquetas de plantilla personalizadas son muy útiles cuando necesita incorporar funcionalidad a la plantilla, y no está cubierta por las que ofrece Django.

Crear etiquetas de plantilla personalizadas

Django posee funciones que permiten crear la propia etiqueta de plantilla de un modo sencillo:

• simple_tag procesa los datos y devuelve una cadena de texto.

• inclusion_tag procesa los datos y devuelve una renderización de plantilla.

Las etiquetas de plantilla conviven dentro de una aplicación de Django.

Dentro del directorio de la aplicación blog, cree un nuevo directorio llamado templatetags, y dentro incluya un fichero vacío llamado __init__.py. Cree también otro fichero llamado blog_tags.py. La estructura de la aplicación blog debería ser:


La forma en que nombre el fichero es importante, ya que usará el mismo nombre para importar el módulo dentro de la plantilla.

Comenzará creando una etiqueta sencilla para recuperar el número total de artículos publicados en el blog. Para ello, edite el fichero blog_tags.py con el siguiente código:


Esto es una etiqueta de plantilla sencilla que devuelve el número de artículos publicados. Cada módulo que contenga etiquetas de plantilla necesita contener una variable, llamada en este caso register, para poder formar una librería de etiquetas. Esta variable es una instancia de template.Library, y se utiliza para registrar las etiquetas y filtros de plantilla. Después se declara una etiqueta llamada total_post como una función Python a la que recubrimos con el decorador @register.simple_tag. Django usará el nombre de la función como nombre de etiqueta. Si quisiera registrarlo con un nombre diferente, lo podría hacer especificando el parámetro name, como @register.simple_tag(name=[^’my_tag’).

Tras añadir un nuevo módulo de etiquetas de plantilla, es necesario reiniciar el servidor de desarrollo de Django para poder usar las nuevas etiquetas o plantillas.

Antes de usar etiquetas de plantilla personalizadas tiene que importar el módulo en la plantilla con la etiqueta {% load %}. Como ya se mencionó, es necesario utilizar el nombre del módulo que contiene sus etiquetas y filtros de plantilla. Abra la plantilla blog/templates/base.html y añada {% load blog_tags %} al comienzo del fichero para cargar dicho módulo. A partir de entonces ya puede utilizar la nueva etiqueta incorporando {% total_post %} en la plantilla. El aspecto final de dicha plantilla será el siguiente:


Para que Django actualice los cambios es necesario reiniciar el servidor. Pare el servidor de desarrollo con Ctrl + C y vuelva a iniciarlo con:


Abra la URL http://127.0.0.1:8000/blog/ en el navegador y debería ver el número total de artículos en la barra lateral del site del siguiente modo:


Las ventajas de utilizar las etiquetas de plantilla personalizadas es que puede procesar datos y añadirlos a cualquier plantilla de forma independiente a la ejecución de la vista. Puede realizar acciones con QuerySets o procesar datos y mostrar los resultados en cualquier plantilla.

Va ahora a crear otra etiqueta de plantilla que muestre el último artículo en la barra lateral del blog. Esta vez utilizará etiquetas de inclusión, las cuales permiten, a través de una etiqueta de plantilla, renderizar plantillas que reciben variables de contexto. Edite el fichero blog_tag.py y añada el siguiente código:


Este código registra una etiqueta de plantilla de tipo inclusión a través del decorador @register.inclusion_tag al que se le especifica la localización de la plantilla a renderizar, en este caso blog/post/latest_posts.html. Esta etiqueta acepta un parámetro opcional count, que por defecto tiene valor 5, el cual permite indicar el número de artículos a mostrar. Este valor se utiliza para limitar los resultados en la consulta Post.published.order_by ('-publish')[:count]. Es importante hacer referencia a que el valor de respuesta de este tipo de etiquetas es un diccionario y siempre debe ser así. Las etiquetas de inclusión deben devolver un diccionario, el cual se usará como contexto de variables a la hora de renderizar la plantilla. Algo similar ocurre en las vistas. La etiqueta de plantilla que acaba de crear permite especificar el número de artículos a mostrar y un modo de uso puede ser {% show_latest_post 3 %}.

Cree ahora otra plantilla en la ruta blog/post/ con el nombre de latest_posts.html e incluya el siguiente código:


Esta plantilla se encarga de mostrar una lista de artículos a partir de la variable latest_posts. Recuerde que esta variable es devuelta por la etiqueta de plantilla. Va ahora a editar la plantilla blog/base.html para añadir la nueva etiqueta de plantilla y mostrar los últimos tres artículos. El código de la barra lateral debe quedar así:


A la etiqueta se le pasa el número de artículos a visualizar y la plantilla es renderizada en el lugar y con el contexto dados.

Para ver los cambios, refresque el navegador y la barra lateral debería asemejarse a esto:


Por último, va a crear una etiqueta de plantilla simple que almacene el resultado en una variable, en vez de devolverlo. Va a hacerlo para el artículo más comentado. Para ello, edite el fichero blog_tags.py y añada la siguiente importación y etiqueta de plantilla:


En este código se construye un QuerySet utilizando la función annotate(), que permite agregar el número total de comentarios por cada artículo. Utilice la función de agregación Count para almacenar el número de comentarios en el campo calculado total_comments para cada uno de los objetos Post. Ordene la consulta por el campo que acaba de calcular, de manera descendente, y limite el número de resultados con la variable count.

Además de la función Count, Django dispone de otras funciones de agregación como Avg, Max, Min y Sum. Más detalles disponibles en https://docs.djangoproject.com/en/2.0/topics/db/aggregation/.

Va a editar la plantilla blog/base.html para incluir el siguiente código a la barra lateral:


Para almacenar el resultado en una variable, utilice el argumento as seguido del nombre de la variable a utilizar. Usará {% get_most_commented_posts as most_commented_posts %} para almacenar el resultado de la etiqueta de plantilla en la variable most_commented_posts. Después, se itera sobre la lista de artículos obtenida mostrando los resultados con forma de enlace.

Para ver los cambios, refresque el navegador. El resultado debería ser semejante a este:


Ahora ya tiene una visión general sobre cómo crear etiquetas de plantilla personalizadas. La documentación sobre esta funcionalidad la puede encontrar en https://docs.djangoproject.com/en/2.0/howto/custom-templatetags/.

Crear filtros de plantilla personalizados

Django trae por defecto una amplia variedad de filtros de plantilla que permiten modificar variables dentro de las plantillas. Aquellas son funciones Python que toman uno o dos parámetros, el valor de la variable de entrada y un argumento opcional, y devuelven un valor que puede mostrarse en la plantilla o servir de entrada a otro filtro. Un filtro tiene el siguiente aspecto: {{ variable|my_filter }}. Mientras que los filtros con argumento son del tipo: {{ variable|my_filter:”foo” }}. Puede aplicar tantos filtros como quiera a una variable, como, {{ variable|filter1|filter2 }}, por ejemplo, donde la salida de cada filtro hace de entrada al siguiente.

Va a crear un filtro de plantilla personalizado para poder utilizar sintaxis de Markdown en el blog, y luego convertir el artículo en contenido HTML que se pueda visualizar. Markdown es una sintaxis de formato en texto plano muy sencilla, cuyo objetivo final suele ser convertirse en formato HTML, sin tener que utilizar el etiquetado del mismo directamente. Puede encontrar más información disponible en https://daringfireball.net/projects/markdown/basics.

Lo primero de todo es instalar el módulo de Python. Use el siguiente comando de pip:


Una vez hecho esto, edite el fichero blog_tags.py e incluya el siguiente código:


Los filtros de plantilla se registran del mismo modo que las etiquetas. Para evitar colisión de nombres entre los nombres de sus plantillas y el módulo markdown, va a nombrar la función como markdown_format y el filtro lo va a llamar markdown, de manera que en una plantilla lo vería como {{ variable|markdown }}. Django, por defecto, escapa al código HTML generado por los filtros. Para evitar esto, Django ofrece una función llamada mark_safe, que permite marcar un contenido como HTML seguro, y que puede renderizarse en una plantilla sin procesamiento. Por defecto, Django no confía en ningún código HTML y tratará de filtrarlo antes de mostrarlo en la salida, por motivos de seguridad. Las únicas excepciones son aquellas variables marcadas como seguras. Este comportamiento previene poder mostrar un código HTML potencialmente peligroso, permitiendo crear con este método excepciones para mostrar un HTML seguro.

Va ahora a cargar el módulo en las plantillas de lista de artículos y en la de detalle de artículos. Para ello, añadirá la siguiente línea al comienzo de los ficheros blog/post/list.html y blog/post/detail.html tras la etiqueta {% extends %}:


En la plantilla de detalle de artículos, también va a modificar la línea:


Y reemplazarla por la línea:


Después, en el fichero post/list.html reemplazará la línea:


por la línea:


El filtro truncatewords_html restringe una cadena de caracteres a un determinado número de palabras, evitando que las etiquetas HTML queden sin cerrar.

Con el navegador se dirigirá a la URL http://127.0.0.1:8000/admin/blog/post/add/ y añadirá un artículo con el siguiente contenido:


Abra el navegador y vaya al artículo que acaba de crear. El aspecto al renderizarlo debería ser:


Como se puede ver en la imagen anterior, los filtros de plantilla personalizados son muy útiles a la hora de aplicar un formato propio. Para obtener más información sobre los filtros personalizados acceda a https://docs.djangoproject.com/en/2.0/howto/custom-template-tags/#writing-custom-template-filters.

Añadir un mapa de sitio

Django trae consigo un sistema que permite generar mapas de sitio de manera dinámica. Un mapa de sitio es un archivo XML donde se almacena información de las páginas del sitio web para que los motores de búsqueda puedan indexar contenido con facilidad, indicando información como la relevancia que tienen o la frecuencia con que actualizan su contenido.

La aplicación de mapas de sitios de Django se encuentra en el módulo django.contrib.sites, el cual permite asociar objetos a sitios web que estén corriendo dentro del proyecto. Esto es especialmente útil cuando queremos correr múltiples sitios web con un único proyecto de Django. Para instalar la aplicación de mapa de sitio necesita activar ambos sitios y la aplicación en el proyecto. Para ello, editará el fichero settings.py del proyecto y añadirá django.contrib.sites y django.contrib.sitemaps a la variable INSTALLED_APPS. También definirá una nueva variable de configuración, el identificador del sitio:


Para poder usar esta aplicación es necesario crear sus tablas en la base de datos. Para ello, ejecute sus migraciones con el siguiente comando:


Con el que obtenemos la siguiente salida:


La aplicación sites ya está sincronizada con la base de datos. Lo siguiente que va a hacer es crear un fichero llamado sitemaps.py dentro del directorio de aplicación blog. En su interior incluirá el siguiente código:


Ha creado una clase personalizada de mapa de sitio heredando de la clase Sitemap del módulo sitemaps. Los atributos changefreq y priority indican la frecuencia de cambio de las páginas de artículos y su relevancia en el sitio web (el valor máximo es 1), respectivamente. El método items() devuelve un QuerySet con los objetos a incluir en este mapa. Por defecto, Django utiliza el método get_absolute_url() con cada uno de los objetos, para recuperar su URL. Recuerde que ya creamos anteriormente este método en el capítulo 1, Construir un blog para obtener la URL canónica de los artículos. Si queremos especificar la URL por cada objeto, puede añadir el método location a la clase de mapa de sitio. El método lastmod devuelve la última fecha de modificación del artículo. Este es llamado internamente, por cada objeto devuelto por el método items(). En este caso, tanto changefreq como priority pueden ser métodos o atributos. Para un detalle mayor, se puede consultar la documentación oficial de Django al respecto en https://docs.djangoproject.com/en/2.0/ref/contrib/sitemaps/.

Por último, es necesario añadir una URL al mapa de sitio. Para ello, es necesario editar el fichero urls.py del proyecto y añadir el mapa de sitio del siguiente modo:



En el código anterior, incluirá las importaciones necesarias y definirá un nuevo diccionario con mapas de sitio. También se incluirá un patrón de URL, que coincida con sitemap.xml y que ejecute la vista de mapa de sitio. El diccionario que ha definido antes, sitemaps, se pasa a la vista sitemap, de forma que se ejecute el comportamiento que ha definido antes. Para ver los cambios, ejecute el servidor de desarrollo y abra la URL http://127.0.0.1:8000/sitemap.xml en el navegador. Podrá ver una salida similar a la siguiente:


La URL de cada artículo se ha generado a partir del método get_absolute_url(). El atributo lastmod corresponde con el campo fecha updated del artículo, tal cual se especificó anteriormente. Los campos changefreq y priority también están recogidos de la clase PostSitemap. Como se puede apreciar, el dominio utilizado para generar las URLs es example.com. Este valor se generó por defecto durante la sincronización de la base de datos. Para modificarlo, abrirá http://127.0.0.1:8000/admin/sites/site/ en el navegador, donde veremos:


La imagen anterior contiene una lista de los sitios disponibles en la aplicación de mapas de sitio. Aquí puede definir el dominio o servidor que quiera que utilice el sitio web y las aplicaciones que de él dependen. Para poder generar URLs que existen en el entorno local, va a cambiar el nombre de dominio a localhost:8000, como se puede ver en la siguiente imagen:


La URL que muestra ahora el mapa de sitios es diferente, utiliza el nuevo dominio que ha definido. En un entorno de producción, es necesario usar el nombre de dominio propio del sitio web.

Sistema de feeds

Django tiene un sistema que facilita la redifusión de contenido, que puede usarse para la generación dinámica de fuentes de información a través de RSS o Atom, de un modo similar a como ha creado el mapa de sitio web. Una fuente web es un formato de datos (generalmente en XML) que proporciona a los usuarios que lo consumen actualizaciones frecuentes de contenido. Los usuarios podrán suscribirse a la fuente de información por medio de un agregador, programa que se encarga de leer de dichas fuentes y mostrar el contenido de las notificaciones.

Va a crear un nuevo fichero en el directorio de la aplicación blog llamado feeds.py con el siguiente contenido:


Lo primero que tiene es una clase que hereda de Feed, clase perteneciente al sistema de feeds de Django. Los atributos title, link y description corresponden con las etiquetas <title>, <link> y <description> de los campos de RSS, respectivamente.

El método items() recupera los objetos a ser incluidos en la difusión de información. Para este caso, se devuelven los cinco últimos artículos. El item_title() y item_description() son métodos que, para cada uno de los objetos devueltos por items(), recuperan el título y la descripción, respectivamente, limitando el contenido a las treinta primeras palabras.

Por último, va a editar el fichero blog/urls.py, incluyendo el patrón de URL, asociándolo a el sistema de feeds:


Para probar su funcionamiento, abra el navegador y diríjase a http://127.0.0.1:8000/blog/feed/. Debería ver información sobre los cinco últimos artículos del blog:


Si abre la misma URL en un cliente de RSS, podrá ver la misma información en una interfaz más amigable.

Para terminar, va a añadir un enlace de suscripción en la barra lateral del blog. Abra la plantilla blog/base.html y añada la siguiente línea debajo del número total de artículos, dentro del bloque div:


Acceda a la URL http://127.0.0.1:8000/blog/ en el navegador. La barra lateral debería quedar del siguiente modo:


Crear un sistema de búsqueda para el blog

Va a añadir al blog algunas capacidades de búsqueda. El ORM de Django permite realizar acciones sencillas de búsqueda por coincidencia de cadenas a través del filtro contains (o, en caso de no considerar mayúsculas o minúsculas, icontains). Con la siguiente consulta se obtienen aquellos artículos en cuyo contenido aparezca la palabra framework:


Sin embargo, si quiere hacer operaciones más complejas de búsqueda, recuperar resultados por similitud o por importancia de términos, necesita usar un motor de búsqueda de texto completo.

Django ofrece una funcionalidad de búsqueda para interactuar con el sistema de búsqueda completa de texto de PostgreSQL. Esta funcionalidad se encuentra en el módulo django.contrib.postgres y, por el momento, no está disponible para ninguna otra base de datos. Para conocer más en detalle las opciones de búsqueda que ofrece PostgreSQL visite https://www.postgresql.org/docs/10/static/textsearch.html.

A pesar de que Django es un framework que ofrece un sistema de base de datos agnóstico, contiene también módulos específicos para aprovechar capacidades especiales y de alto valor, ofrecidas por PostgreSQL.

Ücretsiz ön izlemeyi tamamladınız.

₺833,07

Türler ve etiketler

Yaş sınırı:
0+
Hacim:
1026 s. 1145 illüstrasyon
ISBN:
9788426728661
Yayıncı:
Telif hakkı:
Bookwire
İndirme biçimi:
Metin PDF
Ortalama puan 5, 1 oylamaya göre
Oracle 12c For Dummies
Chris Ruel и др.
Metin PDF
Ortalama puan 4, 1 oylamaya göre
Metin
Ortalama puan 0, 0 oylamaya göre
Metin PDF
Ortalama puan 0, 0 oylamaya göre
Metin PDF
Ortalama puan 0, 0 oylamaya göre
Active Directory For Dummies
Steve Clines и др.
Metin PDF
Ortalama puan 1, 1 oylamaya göre
Metin
Ortalama puan 0, 0 oylamaya göre
IEEE 802 Wireless Systems
Stefan Mangold и др.
Metin PDF
Ortalama puan 0, 0 oylamaya göre
Metin
Ortalama puan 4, 1 oylamaya göre