"Demasiados valores para desempacotar" excepção
infelizmente, tenho um problema: cada vez que tento colocar o perfil do Utilizador dentro de um modelo (user.get_template.lastIP
, por exemplo), Tenho o seguinte erro:
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 unpackAlguma ideia do que se passa ou do que estou a fazer de errado?
5 answers
Essa excepção significa que estás a tentar desempacotar uma tupla, mas a tupla tem demasiados valores em relação ao número de variáveis-alvo. Por exemplo: Este trabalho, e imprime 1, depois 2, Depois 3
def returnATupleWithThreeValues():
return (1,2,3)
a,b,c = returnATupleWithThreeValues()
print a
print b
print c
Mas isto levanta o teu erro.
def returnATupleWithThreeValues():
return (1,2,3)
a,b = returnATupleWithThreeValues()
print a
print b
Aumento
Traceback (most recent call last):
File "c.py", line 3, in ?
a,b = returnATupleWithThreeValues()
ValueError: too many values to unpack
A razão pela qual isto acontece no teu caso, não sei, mas talvez esta resposta te aponte na direcção certa.
Tente desempacotar numa variável,
O Python irá lidar com isto como uma lista,
Depois desfaz as malas da 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
Para citar a entrada no blog:
O valor da configuração não é "appname.modelo.modelname", É só ... "appname.modelname". A razão é que Django não está usando isso para fazer uma importação direta; em vez disso, está usando uma função interna de carregamento de modelos que só quer o nome do aplicativo e o nome do modelo. A tentar fazer coisas como "appname".modelo.modelname " ou " projectname.appname.modelo.modelname " na configuração AUTH_PROFILE_ Module fará com que o Django expluda com o temido erro "demasiados valores para desfazer", por isso certifique-se que colocou "appname".modelname", e nada mais, no valor de AUTH_PROFILE_MODULE.
Se o OP tivesse copiado mais do traceback eu esperaria ver algo como o abaixo do qual eu era capaz de duplicar adicionando "modelos" à minha configuração AUTH_ PROFILE_MÓDULE.
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
Acho que este é um dos poucos casos em que o Django ainda tem um pouco de magia de importação que tende a causar confusão quando um pequeno erro não abre a excepção esperada.
Você pode ver no final do traceback que eu postei como usando qualquer coisa diferente o formulário " appname.modelname "para o AUTH_PROFILE_MODULE causaria a linha" app_label, model_name = configurações.AUTH_PROFILE_MODULE.dividir('.') "para lançar o erro de" demasiados valores para desempacotar".
Tenho 99% de certeza que este foi o problema original encontrado aqui.
Provavelmente há um erro algures na chamada get_profile (). Na sua opinião, antes de devolver o objecto do pedido, coloque esta linha:
request.user.get_profile()
Ele deve aumentar o erro, e dar-lhe um traceback mais detalhado, que você pode então usar para mais depuração.
runserver_plus
comando a partir de django_extensions.
Ele usa o depurador werkzeug que também é muito melhor e tem uma consola de depuração interactiva muito boa. Ele faz alguma magia ajax para lançar uma shell python em qualquer frame (na pilha de chamadas) para que você possa depurar.