es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Necesitas agregar una funcionalidad de búsqueda en una vista basada en clases de Django.

Tengo una función de búsqueda en una vista basada en funciones que funciona bien.
Este es el código de la vista basada en funciones:

def BlogList(request):
blogs = Blog.objects.all()
if request.method == 'GET':
    search = request.GET.get('search', '')
    blogs = Blog.objects.filter(blog_title__icontains=search)
return render(request, 'App_Blog/blog_list.html', context={'search':search, 'blogs':blogs})

Pero ahora quiero reemplazar esa vista basada en funciones implementándola en esta vista basada en clases.

class BlogList(ListView):
context_object_name = 'blogs'
model = Blog
template_name = 'App_Blog/blog_list.html'

Este es mi models.py:

class Blog(models.Model):
author = models.ForeignKey(User, on_delete=models.CASCADE, related_name='post_author')
blog_title = models.CharField(max_length=264, verbose_name="Poner un título")
slug = models.SlugField(max_length=264, unique=True)
blog_content = models.TextField(verbose_name="¿Qué tienes en mente?")
blog_image = models.ImageField(upload_to='blog_images', verbose_name="Imagen")
publish_date = models.DateTimeField(auto_now_add=True)
update_date = models.DateTimeField(auto_now=True)

class Meta:
    ordering = ['-publish_date',]

def __str__(self):
    return self.blog_title

Parte HTML de la función de búsqueda:

Como soy novato, he probado diferentes soluciones pero no lo he logrado. Estaré encantado si alguien me ayuda con esto.

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Para implementar la función de búsqueda en la vista basada en clases, puedes sobrescribir el método get_queryset y agregar la lógica de búsqueda allí. Así es como puedes hacerlo:

    class BlogList(ListView):
        context_object_name = 'blogs'
        model = Blog
        template_name = 'App_Blog/blog_list.html'
    
        def get_queryset(self):
            queryset = super().get_queryset()
            search = self.request.GET.get('search')
            if search:
                queryset = queryset.filter(blog_title__icontains=search)
            return queryset
    

    En el código anterior, estamos sobrescribiendo el método get_queryset, que devuelve el queryset que se utilizará para poblar la ListView. Primero llamamos al método de la superclase para obtener el queryset original, luego verificamos si hay un parámetro de búsqueda en la solicitud. Si lo hay, filtramos el queryset por el parámetro de búsqueda. Finalmente, devolvemos el queryset modificado.

    En tu HTML, puedes mantener el mismo formulario que antes:

    <form class="form-inline ml-auto" method="GET">
        <input class="form-control mr-sm-2" type="text" name="search" placeholder="Buscar el tema">
        <button class="btn btn-success" type="submit">Buscar</button>
    </form>
    

    Cuando se envíe el formulario, el término de búsqueda se incluirá en la cadena de consulta de la URL, que será recogida por el método get_queryset y utilizado para filtrar el queryset.

Comments are closed.