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 GET
y está disponible en kwargs
o 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.