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