Exceção “Muitos valores para desempacotar”

116

Estou trabalhando em um projeto no Django e acabei de começar a tentar estender o modelo de usuário para fazer perfis de usuário.

Infelizmente, tive um problema: toda vez que tento obter o perfil do usuário dentro de um modelo ( user.get_template.lastIPpor exemplo), recebo o seguinte erro:

Meio Ambiente:

Método de solicitação: GET
URL de solicitação: http: // localhost: 8000 /
Versão Django: 1.1
Versão Python: 2.6.1

Erro de modelo:
No template /path/to/base.tpl, erro na linha 19
   Detectou uma exceção durante a renderização: muitos valores para desempacotar

19: Olá, {{user.username}} ({{user.get_profile.rep}}). Como vai? Sair


Tipo de exceção: TemplateSyntaxError em /
Valor de exceção: detectou uma exceção durante a renderização: muitos valores para desempacotar

Alguma ideia do que está acontecendo ou o que estou fazendo de errado?

Steve Gattuso
fonte
3
Não é informação suficiente. Publique o seu modelo de UserProfile.
Daniel Roseman

Respostas:

189

Essa exceção significa que você está tentando desempacotar uma tupla, mas a tupla tem muitos valores em relação ao número de variáveis ​​de destino. 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 isso levanta o seu erro

def returnATupleWithThreeValues():
    return (1,2,3)
a,b = returnATupleWithThreeValues()
print a
print b

levanta

Traceback (most recent call last):
  File "c.py", line 3, in ?
    a,b = returnATupleWithThreeValues()
ValueError: too many values to unpack

Agora, a razão pela qual isso acontece no seu caso, eu não sei, mas talvez esta resposta o aponte na direção certa.

Stefano Borini
fonte
1
@Sterfano Borini, também estou recebendo um erro semelhante, mas no meu caso, estou criando uma string, obj='{"vendorId": "' + vID +'", "vendorName" :"'+vName+'", "addedDate" : "'+vAddedDate+'","usersList" : "'+ usersList + '," status" : "'+str(vStatus)+'","edit"'+edit+'"}';embora todos os valores sejam string, isso me dá um erro, eu executo no prompt do python, ele está em execução, mas enquanto recebo a resposta da web, me dá essa exceção. você pode sugerir o que está errado.
MegaBytes de
Para qualquer pessoa que ainda não entendeu (ou seja, eu), este vídeo explica exatamente a mesma coisa ... com palavras e imagens que de alguma forma me fizeram entender :)
Wesley Smith
O erro não significa necessariamente que um tupleestá sendo descompactado. Pode ser qualquer tipo de sequência. Ele pode permitir qualquer tipo iterável; Não consigo me lembrar de improviso.
jpmc26
20

tente descompactar em uma variável,

python vai lidar com isso como uma lista,

então descompacte 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
Ahmad Dwaik
fonte
4
alguém pode explicar mais sobre isso?
carona
8

Este problema parecia familiar, então pensei em ver se poderia replicar a partir da quantidade limitada de informações.

Uma rápida pesquisa revelou uma entrada no blog de James Bennett aqui que menciona que ao trabalhar com o UserProfile para estender o modelo de usuário, um erro comum em settings.py pode fazer com que o Django lance esse erro.

Para citar a entrada do blog:

O valor da configuração não é "appname.models.modelname", é apenas "appname.modelname". A razão é que o Django não está usando isso para fazer uma importação direta; em vez disso, está usando uma função de carregamento de modelo interna que deseja apenas o nome do aplicativo e o nome do modelo. Tentar fazer coisas como "appname.models.modelname" ou "projectname.appname.models.modelname" na configuração AUTH_PROFILE_MODULE fará com que o Django exploda com o temido erro "muitos valores para desempacotar", então certifique-se de coloque "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, que fui capaz de duplicar adicionando "modelos" à minha configuração 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

Acho que esse é 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 lança a exceção esperada.

Você pode ver no final do traceback que postei como usar qualquer coisa diferente do formulário "appname.modelname" para AUTH_PROFILE_MODULE faria com que a linha "app_label, model_name = settings.AUTH_PROFILE_MODULE.split ('.')" Para lançar o erro "muitos valores para desempacotar".

Tenho 99% de certeza de que esse foi o problema original encontrado aqui.

Hylidan
fonte
O que acontece se você não tiver AUTH_PROFILE_MODULEno seu settings.py?
Sevenearths
0

Provavelmente há um erro em algum lugar na chamada get_profile (). Em sua opinião, antes de retornar o objeto de solicitação, coloque esta linha:

request.user.get_profile()

Ele deve gerar o erro e fornecer um rastreamento mais detalhado, que você pode usar para depurar posteriormente.

sacerdote
fonte
0

Isso acontece comigo quando estou usando o Jinja2 para modelos. O problema pode ser resolvido executando o servidor de desenvolvimento usando o runserver_pluscomando de django_extensions .

Ele usa o werkzeug depurador que também é muito melhor e tem um console de depuração interativo muito bom. Ele faz alguma mágica ajax para lançar um shell python em qualquer quadro (na pilha de chamadas) para que você possa depurar.

Hassen
fonte