2009-05-27 10 views
15

Estoy aprendiendo Django creando una aplicación de recetas sencilla. Tengo un modelo de 1 tabla que utiliza la opción de campo 'opciones' para las categorías de recetas en lugar de utilizar una segunda tabla de 'categorías' y una relación de clave externa. Así que creé una tabla db a través de syncdb y luego cargué la tabla con datos de prueba. Cuando voy a la administración y haga clic en el enlace 'recetas' en un intento de ver las recetas me sale el siguiente error:django error 'demasiados valores para descomprimir'

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 que sería grande. Db es Sqlite. La versión de Django es 1.0. El modelo se enumeran 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) 
+0

A menos, hay un error en la versión dev Django, esto no parece problemático. ¿Hay alguna posibilidad de que tenga plantillas de administración personalizadas o definiciones de ModelAdmin en alguna parte? –

Respuesta

2

Si tuviera que adivinar, es porque lo que está en la plantilla administrativa espera una lista de tuplas, pero en cambio hemos suministrado una tupla de tuplas (de ahí el "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'),   
] 
+0

Las opciones de Django pueden ser iterables (http://docs.djangoproject.com/en/dev/ref/models/fields/#choices), no solo una "lista o una tupla", por lo que no es probable, a pesar de que es un buen pensamiento. –

+0

Ah, maldición. ¡Merece un intento! –

0

Lo tengo trabajando. La mayoría de los "demasiados valores para descomprimir" los errores que encontré mientras buscaba en Google eran tipos de errores 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 algún problema en los datos que sqlite permitía en la importación. Así que eliminé 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.

+0

Tengo que decir que esta no es una respuesta terriblemente satisfactoria. Estaría más interesado en saber cómo solucionar el problema (y por lo tanto qué era), no en una solución alternativa. Después de todo, ¿qué pasa si ocurre nuevamente? Pero me alegro de que haya podido encontrar una solución que funcione para usted. –

+0

Aquí tuve el mismo problema: "demasiados valores para descomprimir" Miré a la pila de excepciones y descubrí que el problema se produjo en una operación de "división" en una marca de tiempo. La marca de tiempo estaba mal codificada porque los datos se insertaron directamente en el shell sqlite. El mensaje que nos da django no es una buena pista sobre el problema real, solo eso. ;) –

0

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

2

Usted debería usar un ChoiceField en lugar de SmallIntegerField

16

Editar: Actualizado a la luz de la corrección del kibibu.

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

Caught ValueError while rendering: too many values to unpack 

Mi clase de formulario fue el siguiente:

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

Nota que mi choices tipo aquí una tupla.documentación oficial de Django lee de la siguiente manera para el choices arg:

An iterable (e.g., a list or tuple) of 2-tuples to use as choices for this field. This argument accepts the same formats as the choices argument to a model field.

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

Este problema fue resuelto por mi observación de la documentación y el uso de una lista de tuplas:

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

Tenga en cuenta que aunque los documentos indican que se puede usar 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: se producen errores.

+0

La lista de tuplas también funciona para mí. choises = [('a_val', 'a'), ('b_val', 'b')]. ¡Gracias! –

+5

'item = forms.ChoiceField (choices = (('17815', '17816')))' NO es una tupla de tuplas. Es una tupla entre paréntesis. Debes hacer 'item = forms.ChoiceField (opciones = (('17815', '17816'),))'. Tenga en cuenta la coma. Por supuesto, su segundo ejemplo es el formato correcto y aún no funciona. – kibibu

0

comentario de kibibu a la respuesta de Kreychek es correcta. Esto no es un problema de Django sino más bien un aspecto interesante de Python. Para resumir:

En Python, los paréntesis redondos se utilizan para el orden de operaciones y las tuplas. Por lo tanto:

foo = (2+2) 

dará lugar a foo siendo 4, no es una tupla que es el primer y único elemento es de 4: 4

foo = (2+2, 3+3) 

dará lugar a foo ser una tupla de dos dimensiones: (4,6)

a decir Python que desea crear una tupla unidimensional en lugar de sólo denota el orden de las operaciones, utiliza una coma final:

foo = (2+2,) 

dará lugar a foo ser una tupla de una dimensión que es el primer y único elemento es de 4: (4,)

Así que para su escenario:

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

daría lo que quiere. 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 puede surgir en otros casos.

Por ejemplo:

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

genere un error si foo es un iterable, pero:

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

o:

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

convertirá adecuadamente foo a una cadena de si es iterable o no.

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

Cuestiones relacionadas