Estoy trabajando en un proyecto en Django y acabo de comenzar a tratar de 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.lastIP, por ejemplo), aparece el siguiente error:

Environment:

Request Method: GET
Request URL: http://localhost:8000/
Django Version: 1.1
Python Version: 2.6.1

Template error:
In template /path/to/base.tpl, error at line 19
   Caught an exception while rendering: too many values to unpack

19 :                Hello, {{user.username}} ({{ user.get_profile.rep}}). How's it goin? Logout


Exception Type: TemplateSyntaxError at /
Exception Value: Caught an exception while rendering: too many values to unpack

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

120
Steve Gattuso 26 sep. 2009 a las 02:04

5 respuestas

La mejor respuesta

Esa excepción significa que está intentando desempaquetar una tupla, pero la tupla tiene demasiados valores con respecto al número de variables objetivo. 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

Plantea

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

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

183
Stefano Borini 25 sep. 2009 a las 22:13

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

Una búsqueda rápida arrojó 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 hacer una importación directa; en cambio, está utilizando una función interna de carga de modelos 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 desempaquetar", así que asegúrese de haber pon "nombre_aplicación.nombredelmodelo", 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 siguiente 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 arroja la excepción esperada.

Puede ver al final del rastreo que publiqué cómo usar cualquier otra cosa que no sea el formulario "nombre_modelo_aplicación" para AUTH_PROFILE_MODULE causaría que la línea "etiqueta_aplicación, nombre_modelo = settings.AUTH_PROFILE_MODULE.split ('.')" Arroje el Error "demasiados valores para descomprimir".

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

8
Hylidan 28 sep. 2009 a las 01:31

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

request.user.get_profile()

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

0
priestc 25 sep. 2009 a las 22:12

Esto me sucede cuando estoy usando Jinja2 para plantillas. El problema se puede resolver ejecutando el servidor de desarrollo utilizando {{X0} } comando de django_extensions.

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

0
hasen 25 sep. 2009 a las 23:03

Intente desempacar en una variable,

Python lo manejará como una lista,

Luego descomprimir 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
18
Ben 21 ene. 2017 a las 14:43