Skip to content

views ‐ Funciones de filtrado de posts

Guillermo Nicolás Petcho edited this page Oct 11, 2024 · 6 revisions

Filtrar publicaciones por:

  1. Categoria.
  2. Antigüedad (asc y desc).
  3. Orden alfabético (asc y desc).

1. Vista listar_posts

def listar_posts(request):
    posts = Post.objects.all()  # Obtén todos los posts
    categorias = Categoria.objects.all()  # Obtén todas las categorías
    ultimosposts = Post.objects.all().order_by('fecha_publicacion')  # Posts ordenados por fecha de publicación

    ultimos_mensajes = MensajeContacto.objects.order_by('-fecha_envio')[:3]  # Obtén los últimos 3 mensajes de contacto

    # Filtrar posts si hay un parámetro de categoría en la URL
    categoria_id = request.GET.get('categoria')
    if categoria_id:
        posts = posts.filter(categorias__id=categoria_id)  # Filtrar posts por categoría

    return render(request, 'inicio.html', {
        'ultimosposts': ultimosposts, 
        'categorias': categorias,
        'mostrar_categorias': True,
        'mostrar_fechas': True,
        'ultimos_mensajes': ultimos_mensajes
    })

Explicación:

  • Objetivo: Listar todos los posts en la página de inicio. Si se selecciona una categoría, filtra los posts por dicha categoría.
  • Variables principales:
    • posts: Obtiene todos los posts de la base de datos.
    • categorias: Obtiene todas las categorías de posts.
    • ultimosposts: Lista de todos los posts, ordenados por fecha de publicación.
    • ultimos_mensajes: Obtiene los últimos 3 mensajes enviados desde el formulario de contacto, ordenados por fecha de envío.
  • Filtro de categoría: Si en la URL se incluye un parámetro categoria (?categoria=1), se filtrarán los posts que pertenecen a esa categoría.
  • Contexto enviado a la plantilla inicio.html: Se pasan los posts, categorías, mensajes recientes, y se indican valores como mostrar_categorias y mostrar_fechas que controlan la visibilidad de ciertos elementos.

2. Vista listar_categorias

def listar_categorias(request):
    categorias = Categoria.objects.all()  # Obtén todas las categorías
    posts = Post.objects.all()  # También obtén todos los posts
    return render(request, 'base.html', {
        'categorias': categorias,
        'posts': posts,
        'mostrar_cargas': True,
        'mostrar_fechas': True
    })

Explicación:

  • Objetivo: Listar todas las categorías y los posts en una página.
  • Contexto enviado a la plantilla base.html: Incluye las categorías y los posts, además de los controles para mostrar fechas y cargas (tal vez imágenes o recursos adicionales).

3. Vista listar_posts_por_categoria

def listar_posts_por_categoria(request, categoria_id):
    categoria = get_object_or_404(Categoria, id=categoria_id)  # Obtener la categoría por ID o dar error 404
    posts = Post.objects.filter(categorias=categoria)  # Filtra posts por categoría seleccionada
    categorias = Categoria.objects.all()  # Obtener todas las categorías

    return render(request, 'filtrado_categorias.html', {
        'posts': posts,
        'categorias': categorias,
        'mostrar_categorias': True,
        'mostrar_fechas': True,
        'mostrar_cargas': True
    })

Explicación:

  • Objetivo: Mostrar los posts que pertenecen a una categoría específica.
  • categoria = get_object_or_404(Categoria, id=categoria_id): Busca una categoría con el categoria_id proporcionado. Si no la encuentra, devuelve un error 404.
  • Contexto enviado a filtrado_categorias.html: Se incluyen los posts filtrados por la categoría seleccionada y todas las categorías (para usarlas como filtros o en un menú lateral).

4. Vista listar_posts_alfabeticamente

def listar_posts_alfabeticamente(request):
    categorias = Categoria.objects.all()  # Obtén todas las categorías
    orden = request.GET.get('orden', 'asc')  # Obtener el orden de la URL, ascendente por defecto
    if orden == 'desc':
        ultimosposts = Post.objects.all().order_by('-titulo')[:4]  # Ordenar de Z a A
    else:
        ultimosposts = Post.objects.all().order_by('titulo')[:4]  # Ordenar de A a Z

    return render(request, 'inicio.html', {
        'ultimosposts': ultimosposts,
        'mostrar_cargas': True,
        'categorias': categorias,
        'mostrar_fechas': True,
        'mostrar_categorias': True
    })

Explicación:

  • Objetivo: Mostrar los posts ordenados alfabéticamente por título, ya sea de A a Z o de Z a A, según el parámetro orden en la URL.
  • orden = request.GET.get('orden', 'asc'): Obtiene el valor del parámetro orden de la URL (por ejemplo, ?orden=desc), y usa "asc" como valor predeterminado.
  • Contexto enviado a inicio.html: Se pasan los posts ordenados, junto con las categorías y otros parámetros de control.

5. Vista fechas

def fechas(request, tipo):
    if tipo == 'recientes':
        posts = Post.objects.all().order_by('-fecha_publicacion')[:4]  # Más recientes
    elif tipo == 'antiguos':
        posts = Post.objects.all().order_by('fecha_publicacion')[:4]  # Más antiguos
    else:
        posts = Post.objects.all()  # Si el tipo no es válido, se muestran todos los posts

    return render(request, 'inicio.html', {
        'posts': posts,
        'mostrar_cargas': True,
        'mostrar_fechas': True,
        'mostrar_categorias': True
    })

Explicación:

  • Objetivo: Filtrar los posts por fecha, ya sean los más recientes o los más antiguos.
  • tipo: Es un parámetro que indica si se deben mostrar los posts más "recientes" o "antiguos".
  • Contexto enviado a inicio.html: Se pasan los posts filtrados por fecha y otros parámetros de control.