web-dev-qa-db-fra.com

"Trop de valeurs à décompresser" Exception

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 utilisateur.

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

 Environnement: 
 
 Méthode de requête: GET 
 URL de la requête: http: // localhost: 8000/
 Version Django: 1.1 
 Version Python: 2.6.1 
 
 Erreur de modèle: 
 Dans template /path/to/base.tpl, erreur à la ligne 19 
 Une erreur s'est produite lors du rendu. : trop de valeurs à décompresser 
 
 19: Bonjour, {{user.username}} ({{user.get_profile.rep}}). Comment ça va? Logout 
 
 
 Type d'exception: TemplateSyntaxError at /
Exception Value: Capture une exception lors du rendu: trop de valeurs à décompresser 
 

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

105
Steve Gattuso

Cette exception signifie que vous essayez de décompresser un tuple, mais que celui-ci comporte trop de valeurs par rapport au nombre de variables cible. 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 le sais pas, mais peut-être que cette réponse vous orientera dans la bonne direction.

171
Stefano Borini

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
17
Ahmad Dwaik

Ce problème me semblait familier, alors je me suis dit que je verrais si je pouvais reproduire à partir du nombre limité d'informations.

Une recherche rapide a permis de trouver une entrée sur le blog de James Bennett ici qui indique que, lorsque vous utilisez UserProfile pour étendre le modèle User, une erreur courante dans settings.py peut provoquer le déclenchement de Django. cette erreur.

Pour citer l'entrée du blog:

La valeur du paramètre n'est pas "appname.models.modelname", il s'agit simplement de "appname.modelname". La raison en 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 demande 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 causera l'erreur Django avec l'explosion "trop ​​de valeurs à décompresser", Veillez donc à bien indiquer "appname.modelname" et rien d'autre dans la valeur de AUTH_PROFILE_MODULE.

Si l'OP avait copié davantage de retraits, 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 tend à semer la confusion lorsque de petites erreurs ne génèrent pas l’exception attendue.

Vous pouvez voir à la fin de la trace que j'ai posté comment utiliser quelque chose d'autre que le formulaire "appname.modelname" pour AUTH_PROFILE_MODULE provoquerait la ligne "app_label, nom_modèle = settings.AUTH_PROFILE_MODULE.split ('.')" Pour lancer le erreur "trop ​​de valeurs à décompresser".

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

8
Hylidan

Il y a probablement une erreur quelque part dans l'appel de get_profile (). Selon vous, avant de renvoyer l'objet de requête, insérez cette ligne:

request.user.get_profile()

Cela devrait générer l'erreur et vous donner une trace plus détaillée, que vous pourrez ensuite utiliser pour poursuivre le débogage.

0
priestc

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 de Django_extensions .

Il utilise le débogueur werkzeug qui, lui aussi, est bien meilleur et possède une très belle console de débogage interactive. Un peu de magie ajax permet de lancer un python Shell à n’importe quel cadre (dans la pile d’appel) afin que vous puissiez déboguer.

0
hasen