Читать книгу Django 2 - Antonio Melé - Страница 53

Añadir funcionalidad de etiquetado

Оглавление

Tras implementar el sistema de comentarios, va a crear un modo de etiquetar los artículos. Esto lo hará integrando aplicaciones de Django de terceros en los proyectos. El módulo django-taggit es una aplicación reutilizable que ofrece un modelo Tag y un gestor que facilita añadir etiquetas a cualquier modelo. En https://github.com/alex/django-taggit puede echar un vistazo al código.

Lo primero que tiene que hacer es instalar django-taggit a través de pip con el siguiente comando:


Tras la instalación, va a editar el fichero settings.py del proyecto mysite e incluir la aplicación taggit en la lista INSTALLED_APPS:


A continuación, abra el fichero models.py de la aplicación blog y añada el gestor TaggableManager que ofrece django-taggit para relacionarlo con el modelo Post:


El gestor tags permite añadir, recuperar y eliminar etiquetas de un objeto Post.

Para generar las migraciones, va a ejecutar el siguiente comando para llevar a cabo los cambios en el modelo:


Obteniendo la siguiente salida:


Ahora, ejecute el siguiente comando para crear las tablas necesarias para los modelos de django-taggit y sincronizar los cambios que ha realizado en Post:


Obtendrá una salida indicando que las migraciones se han aplicado:


Con esto, la base de datos está lista para utilizar los modelos de django-taggit. A continuación, se detalla cómo usar el gestor tags. Para ello abra una consola y ejecute el comando python manage.py shell. Una vez tengamos el intérprete listo, ejecute las siguientes líneas de código para recuperar uno de los artículos (el que tiene id 1):


Ahora va a añadir algunas etiquetas y verificar que se han incorporado correctamente:


Por último, eliminará una etiqueta y verificar la lista de etiquetas:


Va a verificar esta misma información desde el panel de administración. Para ello, ejecute el servidor de desarrollo con python manage.py runserver y abra la URL http://127.0.0.1:8000/admin/taggit/tag/ en el navegador. Puede ver la página con la lista de objetos Tag de la aplicación taggit:


Vaya a http://127.0.0.1:8000/admin/blog/post/ y pulse sobre un artículo para poder editarlo. Los artículos ahora tienen un nuevo campo Tags, el cual se puede editar con facilidad:


Lo siguiente es modificar el blog para mostrar las etiquetas. Edite la plantilla blog/post/list.html y añada el siguiente código HTML tras el título del artículo:


El filtro de plantilla join funciona como el método join() de la clase string en Python, permitiendo concatenar elementos con la cadena dada. Navegará hasta http://127.0.0.1:8000/blog/ y debería ver algo similar a esto:


Va ahora a editar la vista post_list para poder mostrar a los usuarios todos los artículos con una etiqueta específica. Para ello, edite el fichero views.py de la aplicación blog, importando el modelo Tag de django-taggit y modificando la vista para que acepte, de forma opcional, un filtrado por etiqueta:


La vista post_list ahora funciona del siguiente modo:

1. Recupera un parámetro opcional, tag_slug, que por defecto tiene valor None. Este parámetro vendrá en la URL.

2. En la vista, se construye un QuerySet inicial, recuperando todos los artículos publicados. En caso de recibir un nombre de etiqueta, se recupera el objeto Tag correspondiente a través del atajo de Django get_object_or_404().

3. Con el objeto, filtrará la lista de artículos por aquellos que contengan la etiqueta mencionada. Dado que es una relación muchos-a-muchos, es necesario filtrar por las etiquetas contenidas en una lista, que, en este caso, es de un solo elemento.

Es necesario recordar que los QuerySets son perezosos, es decir, se ejecutan contra la base de datos solo cuando itere sobre la lista de artículos, cuando trate de renderizarlos o procesarlos de algún modo.

Por último, va a modificar la función render() abajo de la vista, para pasar la variable tag a la plantilla. La vista quedará finalmente así:


Queda modificar el fichero urls.py de la aplicación blog, comentar el patrón de URL de la vista basada en clase PostListView, y descomentar la vista post_list:


Añada también el patrón de URL para listar los artículos por etiqueta:


Como se puede ver, los dos patrones de URL utilizan la misma vista, pero los ha nombrado de un modo diferente. El primer patrón llama a la vista post_list sin ningún parámetro opcional, mientras que el segundo llama a la vista con el parámetro tag_slug. Esto indica que el parámetro es de tipo slug, de forma que sea una cadena de texto en minúsculas, formado por letras y/o números ASCII, y que pueda contener guiones medios y/o bajos.

Ahora que vuelve a usar la vista post_list, es necesario modificar la paginación para usar el objeto post dentro de la plantilla blog/post/list.html:


Añada las siguientes líneas antes de bucle {% for %}:


Cuando los usuarios accedan al blog verán la lista de todos los artículos, y si filtran por etiqueta, verán los que contengan la etiqueta seleccionada. Va ahora a modificar la forma en que se muestran las etiquetas:


Ahora iterará sobre todas las etiquetas del artículo, mostrando por cada una de ellas un enlace para filtrar los artículos por dicha etiqueta. Ha construido la URL con {% url "blog:post_list_by_tag" tag.slug %}, con el nombre de la URL y la etiqueta slug como parámetros.

Abra http://127.0.0.1:8000/blog/ en el navegador y pinche sobre cualquier etiqueta. Esto nos mostrará todos los artículos con dicha etiqueta:


Django 2

Подняться наверх