"Demasiados valores para desempacotar" excepção

Estou a trabalhar num projecto em Django e comecei a tentar alargar o modelo de utilizador para fazer perfis de utilizador.

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 unpack

Alguma ideia do que se passa ou do que estou a fazer de errado?

Author: Alfred Myers, 2009-09-26

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.
 157
Author: Stefano Borini, 2009-09-25 22:13:22

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
 15
Author: Ahmad Dwaik, 2017-01-21 14:43:26
Este problema parecia-me familiar, por isso pensei em ver se conseguia replicar a partir da quantidade limitada de informação. Uma pesquisa rápida mostrou uma entrada no blog de James Bennett que menciona que, ao trabalhar com o perfil do Usuário para estender o modelo de usuário, um erro comum em settings.py pode levar o Django a cometer este erro.

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.
 8
Author: Hylidan, 2009-09-28 01:31:11

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.

 0
Author: priestc, 2009-09-25 22:12:03
Isto acontece-me quando estou a usar o Jinja2 para modelos. O problema pode ser resolvido executando o servidor de desenvolvimento usando 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.

 0
Author: hasen, 2009-09-25 23:03:52