132 votes

"Trop de valeurs à déballer" Exception

Je travaille sur un projet dans Django et je viens de commencer à essayer d'étendre le modèle Utilisateur afin de créer des profils d'utilisateurs.

Malheureusement, j'ai rencontré un problème : chaque fois que j'essaie de récupérer le profil de l'utilisateur dans un modèle ( user.get_template.lastIP par exemple), j'obtiens l'erreur suivante :

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

Une idée de ce qui se passe ou de ce que je fais mal ?

3 votes

Pas assez d'informations. Veuillez afficher votre modèle de profil d'utilisateur.

203voto

Stefano Borini Points 36904

Cette exception signifie que vous essayez de décompresser un tuple, mais que le tuple a trop de valeurs par rapport au nombre de variables cibles. Par exemple : this work, et imprime 1, puis 2, puis 3

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

Mais cela soulève votre erreur

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

soulève

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

Maintenant, la raison pour laquelle cela se produit dans votre cas, je ne le sais pas, mais peut-être cette réponse vous orientera-t-elle dans la bonne direction.

1 votes

@Sterfano Borini, j'obtiens également une erreur similaire mais dans mon cas, je crée une chaîne de caractères en tant que obj='{"vendorId": "' + vID +'", "vendorName" :"'+vName+'", "addedDate" : "'+vAddedDate+'","usersList" : "'+ usersList + '," status" : "'+str(vStatus)+'","edit"'+edit+'"}'; Bien que toutes les valeurs soient des chaînes de caractères, cela me donne une erreur, je l'exécute sur l'invite python, il fonctionne, mais en prenant la réponse du web, il me donne cette exception.

0 votes

Pour tous ceux qui n'ont toujours pas compris (c'est-à-dire moi) cette vidéo explique exactement la même chose... avec des mots et des images qui m'ont permis de comprendre :)

0 votes

L'erreur ne signifie pas nécessairement qu'un tuple est en cours de déballage. Il peut s'agir de n'importe quel type de séquence. Il pourrait permettre n'importe quel type d'itérable ; je ne m'en souviens pas de mémoire.

21voto

Ahmad Dwaik Points 405

Essayez de déballer dans une seule variable,

python le traitera comme une liste,

puis déballer à partir de la liste

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

5 votes

Quelqu'un peut-il m'en dire plus à ce sujet ?

0 votes

@piggyback : quelle est votre question ?

8voto

Brandon C Points 384

Ce problème m'étant familier, je me suis dit que j'allais voir si je pouvais le reproduire à partir du peu d'informations dont je dispose.

Une recherche rapide a permis de trouver un article sur le blog de James Bennett. aquí qui mentionne que lorsque l'on travaille avec UserProfile pour étendre le modèle User, une erreur courante dans settings.py peut provoquer cette erreur dans Django.

Pour citer l'article du blog :

La valeur du paramètre n'est pas "appname.models.modelname", c'est juste "appname.modelname". La raison en est que Django ne l'utilise pas pour effectuer une importation directe ; il utilise plutôt une fonction interne de chargement de modèle qui ne veut que le nom de l'application et le nom du modèle. Essayer de faire des choses comme "appname.models.modelname" ou "projectname.appname.models.modelname" dans le paramètre AUTH_PROFILE_MODULE fera exploser Django avec la redoutable erreur "too many values to unpack", donc assurez-vous que vous avez mis "appname.modelname", et rien d'autre, dans la valeur de AUTH_PROFILE_MODULE.

Si l'OP avait copié une plus grande partie de la traceback, je m'attendrais à voir quelque chose comme celui ci-dessous que j'ai pu reproduire en ajoutant "models" à mon paramètre 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

Je pense que c'est l'un des rares cas où Django a encore un peu de magie d'importation qui tend à causer de la confusion lorsqu'une petite erreur ne lève pas l'exception attendue.

Vous pouvez voir à la fin de la traceback que j'ai postée comment l'utilisation d'une forme autre que "appname.modelname" pour le AUTH_PROFILE_MODULE entraînerait la ligne "app_label, model_name = settings.AUTH_PROFILE_MODULE.split('.')" à lancer l'erreur "too many values to unpack".

Je suis sûr à 99 % que c'était le problème initial rencontré ici.

0 votes

Que se passe-t-il si vous n'avez pas AUTH_PROFILE_MODULE dans votre settings.py ?

0voto

priestc Points 5002

Il est fort probable qu'il y ait une erreur quelque part dans l'appel get_profile(). Dans votre vue, avant de retourner l'objet de requête, mettez cette ligne :

request.user.get_profile()

Cela devrait lever l'erreur et vous donner une trace plus détaillée, que vous pourrez utiliser pour déboguer davantage.

0voto

hasenj Points 36139

Cela m'arrive lorsque j'utilise Jinja2 pour les modèles. Le problème peut être résolu en exécutant le serveur de développement à l'aide de la commande runserver_plus à partir de django_extensions .

Il utilise le werkzeug qui se trouve être bien meilleur et possède une très belle console de débogage interactive. Il fait un peu de magie ajax pour lancer un shell python sur tout (dans la pile d'appels) pour que vous puissiez déboguer.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X