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.
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:
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:
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.