Django 2. Antonio Melé
Чтение книги онлайн.
Читать онлайн книгу Django 2 - Antonio Melé страница 21
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:
Recuperar artículos por similitud
Una vez implementado el sistema de etiquetado en el blog, puede utilizarlo para hacer cosas interesantes con él. A través de las etiquetas, puede clasificar de forma muy específica el contenido del blog. Artículos de temas relacionados tendrán etiquetas comunes. Va a construir una funcionalidad para mostrar artículos similares según la cantidad de etiquetas en común. De esta forma, cuando un usuario lea un artículo, puede sugerirle leer otros con contenido relacionado.
Para recuperar los artículos similares a otro artículo, es necesario realizar los siguientes pasos:
1. Recuperar todas las etiquetas del artículo actual.
2. Recuperar todos los artículos que contengan algunas de las etiquetas previamente recuperadas.
3. Excluir el artículo actual de la lista anterior para evitar recomendar el mismo artículo.
4. Ordenar los resultados por número de etiquetas en común con el artículo actual.
5. En caso de que uno o más artículos contengan el mismo número de etiquetas, se recomienda el más reciente.
6. Limitar la consulta al número de artículos que quiere recomendar.
Estos pasos se trasladan a consultas complejas que incluirá en la vista post_detail. Va a editar el fichero views.py y añadir la siguiente línea de importación al comienzo del fichero:
Esta es la función de agregación Count del ORM de Django. Esta función permite realizar contabilizaciones agregadas de etiquetas. El módulo django.db.models incluye las siguientes funciones de agregación:
• Avg: The value average
• Max: The maximum value
• Min: The minimum value
• Count: The objects