recorrer list o dict desde los templates

3,371 views
Skip to first unread message

Milton Galo Patricio Inostroza Aguilera

unread,
Mar 17, 2008, 1:29:04 AM3/17/08
to djan...@googlegroups.com
buenos dias:

estoy tratando de iterar sobre un diccionario o una lista en un
template pero me he dado cuenta que no me lo permite y me envia un
error, que es el siguiente:

TemplateSyntaxError at /pedido/
Could not parse the remainder: '[0]' from 'i[0]'


al parecer no se lleva bien con las "porciones" y quizas no puede
iterar sobre un objeto que no conozca...no lo se, soy aún muy novato.


En mi models.py tengo lo siguiente:

class Cliente(models.Model):
nombre = models.CharField(max_length=30)
empresa = models.ForeignKey(Empresa)
telefono = models.CharField(max_length=70)
descripcion = models.TextField()

def __unicode__(self):
return self.nombre

class Admin:
pass

class Producto(models.Model):
nombre = models.CharField(max_length=30)
existencia = models.IntegerField()

def __unicode__(self):
return self.nombre

class Admin:
pass


class Pedido(models.Model):
cliente = models.ForeignKey(Cliente)
fecha_pedido = models.DateField(auto_now_add=True)
fecha_despacho = models.DateField()
fecha_pago = models.DateField()
valor_total = models.IntegerField()
productos = models.ManyToManyField(Producto, through="Detalle")

def __unicode__(self):
return str(self.fecha_pedido) + ' - ' + self.cliente.nombre

class Admin:
pass

class Detalle(models.Model):
producto = models.ForeignKey(Producto)
pedido = models.ForeignKey(Pedido)
cantidad_detalle = models.IntegerField()
valor_detalle = models.IntegerField()

def __unicode__(self):
return str(self.producto) + ' ' + str(self.pedido)

class Admin:
pass

El codigo del views.py es:

def pedido(request):
fecha = date(int(fecha[0]),int(fecha[1]),int(fecha[2]))
pedidos = models.Pedido.objects.filter(fecha_despacho=fecha)
resultado = []
for i in pedidos:
detalles = models.Detalle.objects.filter(pedido=i.id)
productos = []
for j in detalles:

productos.append([j.producto.nombre,j.cantidad_detalle,j.valor_detalle])
resultado.append([i.cliente.nombre,1,i.valor_total,productos])
return render_to_response('templates/ListarPedido.html',{
'opcion':fecha,
'resultado':resultado})

y el código en el template es:

<div id="opcion">
<p align="center">Despachos para el dia: <b>{{opcion}}</b></p>
</div>
<div id="cuerpo">
<div class="module">
{% for i in resultado %}
<table>
<caption>{{i[0]}} - {{i[0].descripcion}}</caption>
{% for j in i[-1]%}
<tr>
<th>Producto :</th>
<td>{{j[0]}}</td>
<th>Cantidad :</th>
<td>{{j[1]}}</td>
<th>Valor total:</th>
<td>{{j[2]}}</td>
</tr>
{% endfor %}
</table>
{% endfor %}
</div>
</div>

Si se fijan tengo que hacer algo sucio para poder retornar el pedido
con sus productos asociados..al parecer ese es aun el problema de las
relaciones ternarias...existen alguna forma de que el motor de
plantillas de django me permita iterar sobre el objeto que estoy
retornando??...he probado retornar un dict y algo mejora pero sigo
teniendo problemas...qué puedo hacer?, agradezco vuestra ayuda,
saludos

--
Milton Inostroza Aguilera

zodman

unread,
Mar 17, 2008, 4:51:47 AM3/17/08
to djan...@googlegroups.com
Mira para empezar ya no estas pasando objectos a tu template LIstarpedido

Le estas pasando completamente listas por lo que hacer i.descripcion o
i.nombre no te va a servir de nada. Lo que le pasas a tu template son
listas [] y no objectos, por lo que no tienen propiedades ( .nombre o
.descripcion).


Lo que puedes hacer es iterar entre las las listas con ciclos for.


Ayudate utilizando la propiedad pprint

{{resultado|pprint}}

Milton Galo Patricio Inostroza Aguilera escribió:

Milton Galo Patricio Inostroza Aguilera

unread,
Mar 17, 2008, 7:20:56 AM3/17/08
to djan...@googlegroups.com
El 17/03/08, zodman <zod...@gmail.com> escribió:

>
> Mira para empezar ya no estas pasando objectos a tu template LIstarpedido
>
> Le estas pasando completamente listas por lo que hacer i.descripcion o
> i.nombre no te va a servir de nada. Lo que le pasas a tu template son
> listas [] y no objectos, por lo que no tienen propiedades ( .nombre o
> .descripcion).

eso si lo se...si te fijas en el view.py dentro de la lista pongo
objetos...el problema es que no me deja iterar sobre la lista....envio
mas detalles del error, por si no queda claro

>
>
> Lo que puedes hacer es iterar entre las las listas con ciclos for.

eso es lo que no me deja

>
>
> Ayudate utilizando la propiedad pprint
>
> {{resultado|pprint}}

TemplateSyntaxError at /pedido/
Could not parse the remainder: '[0]' from 'i[0]'

Request Method: POST
Request URL: http://localhost:8000/pedido/
Exception Type: TemplateSyntaxError
Exception Value: Could not parse the remainder: '[0]' from 'i[0]'
Exception Location:
/usr/lib/python2.5/site-packages/django/template/__init__.py in
__init__, line 509

Template error

In template /media/ARCHIVOS/desarrollo-web/dispromar/venta/templates/ListarPedido.html,
error at line 30


Could not parse the remainder: '[0]' from 'i[0]'

30 {% for i in resultado %}

esta es la linea del error

--
Milton Inostroza Aguilera

Beni

unread,
Mar 17, 2008, 7:44:12 AM3/17/08
to djan...@googlegroups.com
2008/3/17 Milton Galo Patricio Inostroza Aguilera <mino...@gmail.com>:
Si lo que quieres es pintar para cada Pedido su detalle de productos,
yo pasaria directamente los objetos pedido, más o menos así:

[(pedido1, [lista_de_productos_pedido1]), ..., (pedidoN,
[lista_de_productos_pedidoM])]

luego en la vista:

{% for tupla in resultado %}
<table>
<caption>{{ tupla.0.cliente.nombre }} - {{ tupla.0.nombre }}</caption>
{% for producto in tupla.1 %}
<tr>
<th>Producto :</th>
<td>{{ producto.nombre }}</td>
<th>Cantidad :</th>
<td>{{ producto.cantidad }}</td>

[ los datos de cada producto ]


</tr>
{% endfor %}
</table>
{% endfor %}

Puedes observar que en las vistas no se puede acceder con los corchetes.

Un saludo.

Julián Romero

unread,
Mar 17, 2008, 8:35:17 AM3/17/08
to djan...@googlegroups.com
Y en ningún caso puedes usar la notación [] para acceder a los elementos
de un array. Si fuera imprescindible puedes usar .0, .1, etc:

{% for e in arr %}
{{ e.0 }} =&gt; {{ e.1 }}
{% endfor %}

arr es un array tal que así: [["a",3],["b",4]]

Mirate esto también:
http://www.djangoproject.com/documentation/templates/#for

Por otro lado, intenta no tener que recrear tus propios objetos, sino
utilizar los que de devuelve el API de acceso a la base de datos.
Tendrás menos código que mantener.

--
Julián Romero

Milton Galo Patricio Inostroza Aguilera

unread,
Mar 17, 2008, 12:17:11 PM3/17/08
to djan...@googlegroups.com
> Si lo que quieres es pintar para cada Pedido su detalle de productos,
> yo pasaria directamente los objetos pedido, más o menos así:
>
> [(pedido1, [lista_de_productos_pedido1]), ..., (pedidoN,
> [lista_de_productos_pedidoM])]
>
> luego en la vista:
>
> {% for tupla in resultado %}
> <table>
> <caption>{{ tupla.0.cliente.nombre }} - {{ tupla.0.nombre }}</caption>
> {% for producto in tupla.1 %}
> <tr>
> <th>Producto :</th>
> <td>{{ producto.nombre }}</td>
> <th>Cantidad :</th>
> <td>{{ producto.cantidad }}</td>
>
> [ los datos de cada producto ]
> </tr>
> {% endfor %}
> </table>
> {% endfor %}

todo funciona de maravillas

>
> Puedes observar que en las vistas no se puede acceder con los corchetes.
>
> Un saludo.
>
>
> >
>


--
Milton Inostroza Aguilera

Milton Galo Patricio Inostroza Aguilera

unread,
Mar 17, 2008, 12:19:02 PM3/17/08
to djan...@googlegroups.com
El 17/03/08, Julián Romero <julian...@gmail.com> escribió:

>
> Y en ningún caso puedes usar la notación [] para acceder a los elementos
> de un array. Si fuera imprescindible puedes usar .0, .1, etc:
>
> {% for e in arr %}
> {{ e.0 }} =&gt; {{ e.1 }}
> {% endfor %}
>
> arr es un array tal que así: [["a",3],["b",4]]
>
> Mirate esto también:
> http://www.djangoproject.com/documentation/templates/#for
>
> Por otro lado, intenta no tener que recrear tus propios objetos, sino
> utilizar los que de devuelve el API de acceso a la base de datos.
> Tendrás menos código que mantener.


pienso lo mismo que tu pero si te fijas no hay otra forma de
hacerlo...incluso el admin no se la pueda con este tipo de objetos


--
Milton Inostroza Aguilera

Reply all
Reply to author
Forward
0 new messages