tutorial starter started quick guide getting python django sqlite

python - starter - models django



Error django ''demasiados valores para descomprimir'' (7)

Acabo de tener el mismo problema ... mi archivo cvs vino de ms excel y los campos de fecha obtuvieron el formato incorrecto al guardar el tiempo. Cambié el formato a algo como ''2010-05-04 13: 05: 46.790454'' (excel me dio el 5/5/2010 10:05:47) y voilaaaa no más ''demasiados valores para descomprimir''

Estoy aprendiendo Django construyendo una aplicación de recetas sencillas. Tengo un modelo de 1 tabla que utiliza la opción de campo "opciones" para las categorías de recetas en lugar de usar una tabla de "2as" categorías y una relación de clave externa. Así que creé la tabla db a través de syncdb y luego cargué la tabla con datos de prueba. Cuando voy a admin y hago clic en el enlace ''Recetas'' para intentar ver las recetas, aparece el siguiente error:

Template error In template /var/lib/python-support/python2.6/django/contrib/admin/templates/admin/change_list.html, error at line 34 Caught an exception while rendering: too many values to unpack

Si alguien puede arrojar luz sobre este error críptico sería genial. Db es Sqlite. La versión de Django es 1.0. El modelo se enumera a continuación:

from django.db import models class Recipe(models.Model): CATEGORY_CHOICES = ( (1, u''Appetizer''), (2, u''Bread''), (3, u''Dessert''), (4, u''Drinks''), (5, u''Main Course''), (6, u''Salad''), (7, u''Side Dish''), (8, u''Soup''), (9, u''Sauce/Marinade''), (10, u''Other''), ) name = models.CharField(max_length=255) submitter = models.CharField(max_length=40) date = models.DateTimeField() category = models.SmallIntegerField(choices=CATEGORY_CHOICES) ingredients = models.TextField() directions = models.TextField() comments = models.TextField(null=True, blank=True)


Deberías usar un ChoiceField lugar de SmallIntegerField


El comentario de Kibibu a la respuesta de Kreychek es correcto. Esto no es un problema de Django, sino un aspecto interesante de Python. Para resumir:

En Python, los paréntesis redondos se utilizan tanto para el orden de las operaciones como para las tuplas. Asi que:

foo = (2+2)

resultará en que foo sea 4, no una tupla cuyo primer y único elemento sea 4: 4

foo = (2+2, 3+3)

resultará en que foo sea una tupla bidimensional: (4,6)

Para decirle a Python que desea crear una tupla unidimensional en lugar de simplemente indicar el orden de las operaciones, use una coma al final:

foo = (2+2,)

resultará en que foo sea una tupla unidimensional cuyo primer y único elemento es 4: (4,)

Así que para su escenario:

class CalcForm(forms.Form): item = forms.ChoiceField(choices=((''17815'', ''17816''),))

darías lo que quieras Usar una lista también es una gran solución (más Pythonic en mi opinión), pero espero que esta respuesta sea informativa ya que esto puede surgir en otros casos.

Por ejemplo:

print("foo: %s" % (foo))

puede dar un error si foo es un iterable, pero:

print("foo: %s" % (foo,))

o:

print("foo: %s" % [foo])

convertirá correctamente foo en una cadena, sea un iterable o no.

Documentación: http://docs.python.org/2/tutorial/datastructures.html#tuples-and-sequences


Lo tengo funcionando. La mayoría de los errores de ''demasiados valores para descomprimir'' que encontré mientras buscaba en Google eran tipos de Error de valor. Mi error fue un tipo de sintaxis de plantilla. Para cargar mi tabla de recetas había importado un archivo csv. Estaba pensando que tal vez había un problema en algún lugar de los datos que sqlite permitía al importar. Así que borré todos los datos y luego agregué 2 recetas manualmente a través del formulario de administración de django. La lista de recetas cargadas después de eso.

Gracias.



Si tuviera que adivinar, es porque lo que sea que esté en la plantilla administrativa espera una lista de tuplas, pero en lugar de eso, ha suministrado una tupla de tuplas (de ahí los "demasiados valores"). Trate de reemplazar con una lista en su lugar:

CATEGORY_CHOICES = [ # Note square brackets. (1, u''Appetizer''), (2, u''Bread''), (3, u''Dessert''), (4, u''Drinks''), (5, u''Main Course''), (6, u''Salad''), (7, u''Side Dish''), (8, u''Soup''), (9, u''Sauce/Marinade''), (10, u''Other''), ]


Edición: Actualizado a la luz de la corrección de kibibu.

Me he encontrado con lo que creo que es este mismo error, produciendo el mensaje:

Caught ValueError while rendering: too many values to unpack

Mi clase de forma fue la siguiente:

class CalcForm(forms.Form): item = forms.ChoiceField(choices=((''17815'', ''17816'')))

Tenga en cuenta que mis choices escriben aquí una tupla. La documentación oficial de Django dice lo siguiente para las choices arg:

Un iterable (por ejemplo, una lista o tupla) de 2-tuplas para usar como opciones para este campo. Este argumento acepta los mismos formatos que el argumento de opciones para un campo modelo.

src: https://docs.djangoproject.com/en/1.3/ref/forms/fields/#django.forms.ChoiceField.choices

Este problema se resolvió observando la documentación y utilizando una lista de tuplas:

class CalcForm(forms.Form): item = forms.ChoiceField(choices=[(''17815'', ''17816'')])

Tenga en cuenta que, si bien los documentos indican que se puede utilizar cualquier iterable de la forma correcta, una tupla de 2-tuplas no funcionó:

item = forms.ChoiceField(choices=((''17815'', ''17816''), (''123'', ''456'')))

Esto produjo el mismo error que antes.

Lección: los errores pasan.