def tag_index(request, tag):
# Las etiquetas antiguas van en mayúscula ("Python") y las nuevas en minúscula: se
# comparan sin distinguir, y se muestra el valor canónico en minúscula.
queryset = published_posts().filter(tags__value__iexact=tag).distinct()
return _listing(request, queryset, tag_index, tag=tag.lower())
def published_posts():
return Post.objects.filter(published_at__lte=timezone.now())
def _listing(request, queryset, view, tag=None):
"""Listado paginado: una entrada por artículo en el idioma activo.
`view` es la vista que llama (index o tag_index): su "Show Code" enseña esa
vista, la consulta de publicados y este listado, que es donde está el trabajo.
"""
posts = pick_language(
queryset.select_related("author").prefetch_related("tags"), translation.get_language()
)
page_obj = Paginator(posts, POSTS_PER_PAGE).get_page(request.GET.get("page"))
logger.debug("Got %d posts (page %s)", len(posts), page_obj.number)
return render(request, "blog/index.html", {
"posts": page_obj.object_list, "page_obj": page_obj, "tag": tag,
**show_code([view, published_posts, _listing], "blog/index.html"),
})