Saltar al contenido

Django: Formulario de búsqueda en ListView basado en clases

Laura, miembro de este equipo de trabajo, nos ha hecho el favor de escribir este artículo porque controla muy bien este tema.

Solución:

Creo que su objetivo es tratar de filtrar el conjunto de consultas en función del envío del formulario, si es así, mediante el uso de GET:

class ProfileSearchView(ListView)
    template_name = '/your/template.html'
    model = Person

    def get_queryset(self):
        name = self.kwargs.get('name', '')
        object_list = self.model.objects.all()
        if name:
            object_list = object_list.filter(name__icontains=name)
        return object_list

Entonces todo lo que necesitas hacer es escribir un get método para representar la plantilla y el contexto.

Tal vez no sea el mejor enfoque. Al usar el código anterior, no necesita definir un formulario Django.

Así es como funciona: las vistas basadas en clases separan su forma de representar la plantilla, procesar el formulario, etc. Me gusta, get maneja la respuesta GET, post maneja la respuesta POST, get_queryset y get_object se explica por sí mismo, y así sucesivamente. La manera fácil de saber cuál es el método disponible, inicie un shell y escriba:

from django.views.generic import ListView si quieres saber sobre ListView

y luego escriba dir(ListView). Allí puede ver todo el método definido y visitar el código fuente para comprenderlo. los get_queryset método utilizado para obtener un conjunto de consultas. ¿Por qué no simplemente definirlo así? También funciona:

class FooView(ListView):
    template_name = 'foo.html'
    queryset = Photo.objects.all()  # or anything

Podemos hacerlo como arriba, pero no podemos hacer un filtrado dinámico usando ese enfoque. Mediante el uso get_queryset podemos hacer un filtrado dinámico, usando cualquier dato/valor/información que tengamos, significa que también podemos usar name parámetro enviado por GETy está disponible en kwargso en este caso, en self.kwargs["some_key"] dónde some_key es cualquier parámetro que especificó

Bueno, creo que dejar la validación al formulario es una buena idea. Tal vez no valga la pena en este caso particular, porque es una forma muy simple, pero seguro con una más complicada (y tal vez la tuya también crezca), así que haría algo como:

class ProfileList(ListView):
    model = Profile
    form_class = ProfileSearchForm
    context_object_name = 'profiles'
    template_name = 'pages/profile/list_profiles.html'
    profiles = []


    def get_queryset(self):
        form = self.form_class(self.request.GET)
        if form.is_valid():
            return Profile.objects.filter(name__icontains=form.cleaned_data['name'])
        return Profile.objects.all()

Esto es similar al enfoque de @jasisz, pero más simple.

class ProfileList(ListView):
    template_name = 'your_template.html'
    model = Profile

    def get_queryset(self):
        query = self.request.GET.get('q')
        if query:
            object_list = self.model.objects.filter(name__icontains=query)
        else:
            object_list = self.model.objects.none()
        return object_list

Entonces todo lo que tienes que hacer en la plantilla html es:

Puntuaciones y reseñas

Si te ha sido de utilidad este post, sería de mucha ayuda si lo compartieras con más entusiastas de la programación así contrubuyes a difundir este contenido.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *