Excepción "Demasiados valores para descomprimir"

116

Estoy trabajando en un proyecto en Django y acabo de empezar a intentar extender el modelo de usuario para crear perfiles de usuario.

Desafortunadamente, me he encontrado con un problema: cada vez que intento obtener el perfil del usuario dentro de una plantilla ( user.get_template.lastIPpor ejemplo), aparece el siguiente error:

Ambiente:

Método de solicitud: OBTENER
URL de solicitud: http: // localhost: 8000 /
Versión de Django: 1.1
Versión de Python: 2.6.1

Error de plantilla:
En la plantilla /path/to/base.tpl, error en la línea 19
   Se detectó una excepción al renderizar: demasiados valores para descomprimir

19: Hola, {{user.username}} ({{user.get_profile.rep}}). ¿Qué tal? Cerrar sesión


Tipo de excepción: TemplateSyntaxError en /
Valor de excepción: se detectó una excepción al renderizar: demasiados valores para descomprimir

¿Alguna idea de qué está pasando o qué estoy haciendo mal?

Steve Gattuso
fuente
3
No hay suficiente información. Publique su modelo de UserProfile.
Daniel Roseman

Respuestas:

190

Esa excepción significa que está intentando descomprimir una tupla, pero la tupla tiene demasiados valores con respecto al número de variables de destino. Por ejemplo: este trabajo e imprime 1, luego 2, luego 3

def returnATupleWithThreeValues():
    return (1,2,3)
a,b,c = returnATupleWithThreeValues()
print a
print b
print c

Pero esto plantea tu error

def returnATupleWithThreeValues():
    return (1,2,3)
a,b = returnATupleWithThreeValues()
print a
print b

levanta

Traceback (most recent call last):
  File "c.py", line 3, in ?
    a,b = returnATupleWithThreeValues()
ValueError: too many values to unpack

Ahora, la razón por la que esto sucede en su caso, no lo sé, pero tal vez esta respuesta le indique la dirección correcta.

Stefano Borini
fuente
1
@Sterfano Borini, también recibo un error similar, pero en mi caso, estoy creando una cadena, ya que obj='{"vendorId": "' + vID +'", "vendorName" :"'+vName+'", "addedDate" : "'+vAddedDate+'","usersList" : "'+ usersList + '," status" : "'+str(vStatus)+'","edit"'+edit+'"}';aunque todos los valores son cadenas, me da un error, lo ejecuto en el indicador de Python, se está ejecutando, pero mientras recibo la respuesta de la web. me da esta excepción. ¿Puede sugerirnos qué va mal?
MegaBytes
Para cualquiera que aún no lo entendió (es decir, yo), este video explica exactamente lo mismo ... con palabras e imágenes que de alguna manera me hicieron entender :)
Wesley Smith
El error no significa necesariamente que tuplese esté desempaquetando a. Puede ser cualquier tipo de secuencia. Podría permitir cualquier tipo iterable; No puedo recordarlo de improviso.
jpmc26
20

intente desembalar en una variable,

Python lo manejará como una lista,

luego descomprime de la lista

def returnATupleWithThreeValues():
    return (1,2,3)
a = returnATupleWithThreeValues() # a is a list (1,2,3)
print a[0] # list[0] = 1
print a[1] # list[1] = 2
print a[2] # list[2] = 3
Ahmad Dwaik
fuente
4
¿Alguien puede explicar más sobre esto?
Piggyback
8

Este problema parecía familiar, así que pensé en ver si podía replicar a partir de la cantidad limitada de información.

Una búsqueda rápida dio como resultado una entrada en el blog de James Bennett aquí que menciona que cuando se trabaja con UserProfile para extender el modelo de usuario, un error común en settings.py puede hacer que Django arroje este error.

Para citar la entrada del blog:

El valor de la configuración no es "appname.models.modelname", es solo "appname.modelname". La razón es que Django no está usando esto para realizar una importación directa; en su lugar, usa una función de carga de modelo interna que solo quiere el nombre de la aplicación y el nombre del modelo. Intentar hacer cosas como "appname.models.modelname" o "projectname.appname.models.modelname" en la configuración AUTH_PROFILE_MODULE hará que Django explote con el temido error "demasiados valores para descomprimir", así que asegúrese de haber ponga "appname.modelname", y nada más, en el valor de AUTH_PROFILE_MODULE.

Si el OP hubiera copiado más del rastreo, esperaría ver algo como el que se muestra a continuación y que pude duplicar agregando "modelos" a mi configuración AUTH_PROFILE_MODULE.

TemplateSyntaxError at /

Caught an exception while rendering: too many values to unpack

Original Traceback (most recent call last):
  File "/home/brandon/Development/DJANGO_VERSIONS/Django-1.0/django/template/debug.py", line 71, in render_node
    result = node.render(context)
  File "/home/brandon/Development/DJANGO_VERSIONS/Django-1.0/django/template/debug.py", line 87, in render
    output = force_unicode(self.filter_expression.resolve(context))
  File "/home/brandon/Development/DJANGO_VERSIONS/Django-1.0/django/template/__init__.py", line 535, in resolve
    obj = self.var.resolve(context)
  File "/home/brandon/Development/DJANGO_VERSIONS/Django-1.0/django/template/__init__.py", line 676, in resolve
    value = self._resolve_lookup(context)
  File "/home/brandon/Development/DJANGO_VERSIONS/Django-1.0/django/template/__init__.py", line 711, in _resolve_lookup
    current = current()
  File "/home/brandon/Development/DJANGO_VERSIONS/Django-1.0/django/contrib/auth/models.py", line 291, in get_profile
    app_label, model_name = settings.AUTH_PROFILE_MODULE.split('.')
ValueError: too many values to unpack

Creo que este es uno de los pocos casos en los que Django todavía tiene un poco de magia de importación que tiende a causar confusión cuando un pequeño error no genera la excepción esperada.

Puede ver al final del rastreo que publiqué cómo el uso de cualquier otra cosa que no sea el formulario "appname.modelname" para el AUTH_PROFILE_MODULE haría que la línea "app_label, model_name = settings.AUTH_PROFILE_MODULE.split ('.')" Arrojara el Error "demasiados valores para descomprimir".

Estoy 99% seguro de que este fue el problema original encontrado aquí.

Hylidan
fuente
¿Qué pasa si no tienes AUTH_PROFILE_MODULEtu settings.py?
Sevenearths
0

Lo más probable es que haya un error en algún lugar de la llamada a get_profile (). En su opinión, antes de devolver el objeto de solicitud, coloque esta línea:

request.user.get_profile()

Debería generar el error y brindarle un rastreo más detallado, que luego puede usar para depurar más.

sacerdotec
fuente
0

Esto me sucede cuando uso Jinja2 para plantillas. El problema se puede resolver ejecutando el servidor de desarrollo usando el runserver_pluscomando de django_extensions .

Utiliza el depurador werkzeug, que también es mucho mejor y tiene una consola de depuración interactiva muy agradable. Hace algo de magia ajax para lanzar un shell de Python en cualquier marco (en la pila de llamadas) para que pueda depurar.

hasen
fuente