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
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ó:
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
[(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.
{% for e in arr %}
{{ e.0 }} => {{ 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
todo funciona de maravillas
>
> Puedes observar que en las vistas no se puede acceder con los corchetes.
>
> Un saludo.
>
>
> >
>
--
Milton Inostroza Aguilera
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