Eccezione "Troppi valori da decomprimere"


116

Sto lavorando a un progetto in Django e ho appena iniziato a provare ad estendere il modello User per creare profili utente.

Sfortunatamente, ho riscontrato un problema: ogni volta che provo a ottenere il profilo dell'utente all'interno di un modello (user.get_template.lastIP , ad esempio), ottengo il seguente errore:

Ambiente:

Metodo di richiesta: GET
URL richiesta: http: // localhost: 8000 /
Versione Django: 1.1.0
Versione Python: 2.6.1

Errore di modello:
Nel modello /path/to/base.tpl, errore alla riga 19
   È stata rilevata un'eccezione durante il rendering: troppi valori da decomprimere

19: Ciao, {{user.username}} ({{user.get_profile.rep}}). Come va? Disconnettersi


Tipo di eccezione: TemplateSyntaxError in /
Valore eccezione: è stata rilevata un'eccezione durante il rendering: troppi valori da decomprimere

Qualche idea su cosa sta succedendo o cosa sto sbagliando?


3
Informazioni insufficienti. Pubblica il tuo modello UserProfile.
Daniel Roseman,

Risposte:


190

Quell'eccezione significa che stai tentando di decomprimere una tupla, ma la tupla ha troppi valori rispetto al numero di variabili di destinazione. Ad esempio: questo funziona e stampa 1, poi 2, quindi 3

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

Ma questo solleva il tuo errore

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

rilanci

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

Ora, il motivo per cui questo accade nel tuo caso, non lo so, ma forse questa risposta ti indirizzerà nella giusta direzione.


1
@Sterfano Borini, ricevo anche un errore simile ma nel mio caso, sto creando una stringa poiché obj='{"vendorId": "' + vID +'", "vendorName" :"'+vName+'", "addedDate" : "'+vAddedDate+'","usersList" : "'+ usersList + '," status" : "'+str(vStatus)+'","edit"'+edit+'"}';sebbene tutti i valori siano stringa, mi dà un errore, lo eseguo su prompt di Python è in esecuzione, ma mentre prendo risposta dal web mi dà questa eccezione. puoi suggerirmi cosa sta andando storto.
MegaByte

Per tutti quelli che ancora non l'hanno capito (cioè me) questo video spiega esattamente la stessa cosa ... con parole e immagini che in qualche modo mi hanno fatto capire :)
Wesley Smith

L'errore non significa necessariamente che a tupleè stato decompresso. Può essere qualsiasi tipo di sequenza. Potrebbe consentire qualsiasi tipo iterabile; Non riesco a ricordare di sfuggita.
jpmc26

20

prova a scompattare in una variabile,

python lo gestirà come una lista,

quindi decomprimere dall'elenco

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

4
qualcuno può spiegare di più su questo?
spalle

8

Questo problema sembrava familiare, quindi ho pensato di vedere se potevo replicare dalla quantità limitata di informazioni.

Una rapida ricerca ha rivelato una voce nel blog di James Bennett qui che menziona che quando si lavora con UserProfile per estendere il modello utente, un errore comune in settings.py può far sì che Django generi questo errore.

Per citare il post del blog:

Il valore dell'impostazione non è "appname.models.modelname", è solo "appname.modelname". Il motivo è che Django non lo utilizza per eseguire un'importazione diretta; invece, utilizza una funzione di caricamento del modello interna che richiede solo il nome dell'app e il nome del modello. Se provi a fare cose come "appname.models.modelname" o "projectname.appname.models.modelname" nell'impostazione AUTH_PROFILE_MODULE, Django esploderà con il temuto errore "troppi valori da decomprimere", quindi assicurati di aver metti "appname.modelname" e nient'altro nel valore di AUTH_PROFILE_MODULE.

Se l'OP avesse copiato più traceback mi sarei aspettato di vedere qualcosa di simile a quello sotto che sono stato in grado di duplicare aggiungendo "models" alla mia impostazione 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

Questo penso sia uno dei pochi casi in cui Django ha ancora un po 'di magia di importazione che tende a creare confusione quando un piccolo errore non genera l'eccezione prevista.

Puoi vedere alla fine del traceback che ho postato come l'utilizzo di qualcosa di diverso dalla forma "appname.modelname" per AUTH_PROFILE_MODULE causerebbe la riga "app_label, model_name = settings.AUTH_PROFILE_MODULE.split ('.')" Per lanciare il Errore "troppi valori da decomprimere".

Sono sicuro al 99% che questo fosse il problema originale riscontrato qui.


Cosa succede se non l'hai AUTH_PROFILE_MODULEnel tuo settings.py?
Sevenearths

0

Molto probabilmente c'è un errore da qualche parte nella chiamata get_profile (). A tuo avviso, prima di restituire l'oggetto richiesta, inserisci questa riga:

request.user.get_profile()

Dovrebbe sollevare l'errore e darti un traceback più dettagliato, che puoi poi usare per un ulteriore debug.


0

Questo mi succede quando utilizzo Jinja2 per i modelli. Il problema può essere risolto eseguendo il server di sviluppo utilizzando il runserver_pluscomando da django_extensions .

Utilizza il debugger werkzeug che è anche molto migliore e ha una console di debug interattiva molto carina. Fa un po 'di magia ajax per lanciare una shell python in qualsiasi frame (nello stack di chiamate) in modo da poter eseguire il debug.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.