"Trop de valeurs à décompresser" Exception

116

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

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

Environnement:

Méthode de demande: GET
URL de la requête: http: // localhost: 8000 /
Version de Django: 1.1
Version Python: 2.6.1

Erreur de modèle:
Dans le template /path/to/base.tpl, erreur à la ligne 19
   Une exception a été détectée lors du rendu: trop de valeurs à décompresser

19: Bonjour, {{user.username}} ({{user.get_profile.rep}}). Comment ça va? Se déconnecter


Type d'exception: TemplateSyntaxError à /
Valeur d'exception: une exception a été détectée lors du rendu: trop de valeurs à décompresser

Des idées sur ce qui se passe ou ce que je fais mal?

Steve Gattuso
la source
3
Pas suffisamment d'informations. Veuillez publier votre modèle UserProfile.
Daniel Roseman

Réponses:

190

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: ce travail, 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 sais pas, mais peut-être que cette réponse vous orientera dans la bonne direction.

Stefano Borini
la source
1
@Sterfano Borini, j'obtiens également une erreur similaire mais dans mon cas, je crée une chaîne car obj='{"vendorId": "' + vID +'", "vendorName" :"'+vName+'", "addedDate" : "'+vAddedDate+'","usersList" : "'+ usersList + '," status" : "'+str(vStatus)+'","edit"'+edit+'"}';bien que toutes les valeurs soient des chaînes, cela me donne une erreur, je l'exécute sur l'invite python, il est en cours d'exécution, mais en prenant la réponse du Web, il me donne cette exception. pouvez-vous s'il vous plaît suggérer ce qui ne va pas.
MegaBytes
Pour tous ceux qui ne l'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 en quelque sorte fait comprendre :)
Wesley Smith
L'erreur ne signifie pas nécessairement qu'un tupleest en cours de décompression. Il peut s'agir de n'importe quel type de séquence. Il peut autoriser n'importe quel type itérable; Je ne peux pas m'en souvenir.
jpmc26
20

essayez de décompresser dans une variable,

python le traitera comme une liste,

puis décompressez 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
Ahmad Dwaik
la source
4
quelqu'un peut-il expliquer plus à ce sujet?
ferroutage
8

Ce problème m'a semblé familier, alors j'ai pensé voir si je pouvais répliquer à partir de la quantité limitée d'informations.

Une recherche rapide a révélé une entrée dans le blog de James Bennett ici qui mentionne que lorsque vous travaillez avec UserProfile pour étendre le modèle User, une erreur courante dans settings.py peut amener Django à lancer cette erreur.

Pour citer l'entrée de blog:

La valeur du paramètre n'est pas "appname.models.modelname", c'est simplement "appname.modelname". La raison est que Django ne l'utilise pas pour effectuer une importation directe; au lieu de cela, il utilise une fonction de chargement de modèle interne 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 l'erreur redoutée "trop ​​de valeurs à décompresser", alors assurez-vous que vous avez mettez "appname.modelname", et rien d'autre, dans la valeur de AUTH_PROFILE_MODULE.

Si l'OP avait copié plus de traceback, je m'attendrais à voir quelque chose comme celui ci-dessous que j'ai pu dupliquer en ajoutant des "modèles" à 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 a tendance à semer la confusion lorsqu'une petite erreur ne lève pas l'exception attendue.

Vous pouvez voir à la fin du retraçage que j'ai posté comment utiliser autre chose que le formulaire "appname.modelname" pour AUTH_PROFILE_MODULE entraînerait la sortie de la ligne "app_label, model_name = settings.AUTH_PROFILE_MODULE.split ('.')" Erreur "trop ​​de valeurs à décompresser".

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

Hylidan
la source
Qu'advient - il si vous n'avez pas AUTH_PROFILE_MODULEdans votre settings.py?
Sevenearths
0

Il y a probablement une erreur quelque part dans l'appel à get_profile (). Dans votre vue, avant de renvoyer l'objet de requête, mettez cette ligne:

request.user.get_profile()

Cela devrait générer l'erreur et vous donner un suivi plus détaillé, que vous pouvez ensuite utiliser pour poursuivre le débogage.

prêtre
la source
0

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 runserver_pluscommande de django_extensions .

Il utilise le débogueur werkzeug qui est également beaucoup mieux et dispose d'une très belle console de débogage interactive. Il fait de la magie ajax pour lancer un shell python à n'importe quelle image (dans la pile d'appels) afin que vous puissiez déboguer.

hasen
la source