Paso de variable de plantilla/template a vista para filtrar resultados

826 views
Skip to first unread message

marcosa2009

unread,
Oct 26, 2016, 4:49:48 AM10/26/16
to Django-es
Hola a todos/as

Estoy muy perdido , no se como hace para enviar desde un plantilla/template, una variable y luego utilizarla en otra vista para filtrar los resultados con ella y que me los devuelva. Os pongo el código.

views.py
from django.views.generic import ListView, DetailView
from .models import Comunidad, Provincia, Poblacion


# class based view
class ComunidadList(ListView):
    model
= Comunidad
   
    #esta fincion me genera la lista de comunidades que se pueden consultar
    def get_queryset(self):
        context = Comunidad.objects.filter(activado='1')
       
return context




class ProvinciaList(ListView):
    model
= Provincia

   
# esta función seria la que debería filtrar por comunidad_id que le envió desde mi plantilla/template
   
# no se como capturar y filtrar lo que envió desde comunidad_list.html la variable comunidad_id

   
def get_context_data(self, **kwargs):
           
context = super(ProvinciaList, self).get_context_data(**kwargs)
           
context = Provincia.objects.filter(comunidad_id=comunidad_id)
           
return self.dispatch(**kwargs)



plantilla/template comunidad_list.html

<h1>Listado</h1>
<p>

</p>
<ul>
    {%
for comunidad in object_list  %}
     
<li > <p> ({{ comunidad.id }} | <a href="{% url "app:provincia-list" comunidad.id %}">{{ comunidad.comunidad }}</a> | {{ comunidad.activado }} | {{ comunidad.comunidad|slugify }}</p></li>
{#      
    {% endfor %}

</ul>


urls.py

from django.conf.urls import url

from .views import (
   
ComunidadList,
   
ComunidadDetail,
   
ProvinciaList,
   
ProvinciaDetail,
   
PoblacionList

)

urlpatterns
= [

    url
(r'^comunidad/$', ComunidadList.as_view(), name='comunidad-list'),
    url
(r'^provincia/(?P<comunidad_id>[0-9]+)$', ProvinciaList.as_view(), name='provincia-list'),
    url
(r'^poblacion/$', PoblacionList.as_view(), name='poblacion-list'),
]


Se que es fácil pero no encuentro por donde meter mano y es de las primeras veces que utilizo, la clases basadas en vistas, y la verdad que no me enterio muy bien .

Gracias por vuestro tiempo.

Saludos

marcosa2009

unread,
Oct 26, 2016, 5:53:32 AM10/26/16
to Django-es
RESUELTO

He cambiado de views.py

# esta función seria la que debería filtrar por comunidad_id que le envió desde mi plantilla/template
   
# no se como capturar y filtrar lo que envió desde comunidad_list.html la variable comunidad_id

   
def get_context_data(self, **kwargs):
           
context = super(ProvinciaList, self).get_context_data(**kwargs)
           
context = Provincia.objects.filter(comunidad_id=comunidad_id)
           
return self.dispatch(**kwargs)

por 
#seleccionamos solo los registros segun lo que nos envia por url la template
def get_queryset(self):
comunidad_id = self.kwargs['comunidad_id']
return Provincia.objects.filter(comunidad_id=comunidad_id)



Y funciona.

Gracias


El miércoles, 26 de octubre de 2016, 10:49:48 (UTC+2), marcosa2009 escribió:
Hola a todos/as

Estoy muy perdido , no se como hace para enviar desde un plantilla/template, una variable y luego utilizarla en otra vista para filtrar los resultados con ella y que me los devuelva. Os pongo el código.

views.py
from django.views.generic import ListView, DetailView
from .models import Comunidad, Provincia, Poblacion


# class based view
class ComunidadList(ListView):
    model
= Comunidad
   
    #esta fincion me genera la lista de comunidades que se pueden consultar
    def get_queryset(self):
        context = Comunidad.objects.filter(activado='1')
       
return context




class
ProvinciaList(ListView):
    model
= Provincia

   
#seleccionamos solo los registros segun lo que nos envia por url la template
def get_queryset(self):
comunidad_id = self.kwargs['comunidad_id']
return Provincia.objects.filter(comunidad_id=comunidad_id)

francisco del roio

unread,
Oct 26, 2016, 5:56:54 AM10/26/16
to djan...@googlegroups.com
Hola,

Mirando tu código, veo un par de cosas:

##### ##### Este es tu código ##### #####
def get_context_data(self, **kwargs):
context = super(ProvinciaList, self).get_context_data(**kwargs)
context = Provincia.objects.filter(comunidad_id=comunidad_id)
return self.dispatch(**kwargs)
##### ##### ##### #####

Fijate que el context tiene que ser un dict, no un queryset, de otro
modo rompés tu vista por completo, así que borrá ese get_context por
completo y fijate el código de abajo, por ahí te sirve mejor.

##############################
def get_queryset(self):

return super(ProvinciaList,
self).get_queryset().filter(comunidad_id=self.kwargs.get("comunidad_id"))
##############################

Los parámetros de la url se almacenan en self.kwargs, que es de tipo dict.

En las Class-based views lo correcto es primero conseguir lo que te da
la clase base y luego alterarlo.

Te pongo un ejemplo con tu código:

##############################
def get_queryset(self):
context = Comunidad.objects.filter(activado='1')
return context
##############################

Yo lo pondría de este modo, fijate el principio de arriba:

##############################
def get_queryset(self):
return super(ComunidadList, self).get_queryset().filter(activado=1)
##############################

Claro que tu código de arriba es técnicamente correcto, pero llegado el
caso que aprendas a usar mejor las class-based views, encontrarás que
vas a tener que hacerle muchos cambios a tu código para usar las
características avanzadas.

Espero que te sirva.

Saludos,
Reply all
Reply to author
Forward
0 new messages