Ausnahme "Zu viele Werte zum Entpacken"

116

Ich arbeite an einem Projekt in Django und habe gerade versucht, das Benutzermodell zu erweitern, um Benutzerprofile zu erstellen.

Leider ist ein Problem aufgetreten: Jedes Mal, wenn ich versuche, das Benutzerprofil in eine Vorlage zu übernehmen ( user.get_template.lastIPz. B.), wird der folgende Fehler angezeigt:

Umgebung:

Anforderungsmethode: GET
URL anfordern: http: // localhost: 8000 /
Django Version: 1.1
Python-Version: 2.6.1

Vorlagenfehler:
In der Vorlage /path/to/base.tpl Fehler in Zeile 19
   Beim Rendern ist eine Ausnahme aufgetreten: Zu viele Werte zum Entpacken

19: Hallo, {{user.username}} ({{user.get_profile.rep}}). Wie geht es dir? Ausloggen


Ausnahmetyp: TemplateSyntaxError at /
Ausnahmewert: Beim Rendern ist eine Ausnahme aufgetreten: Zu viele Werte zum Entpacken

Irgendwelche Ideen, was los ist oder was ich falsch mache?

Steve Gattuso
quelle
3
Nicht genug Information. Bitte posten Sie Ihr UserProfile-Modell.
Daniel Roseman

Antworten:

189

Diese Ausnahme bedeutet, dass Sie versuchen, ein Tupel zu entpacken, das Tupel jedoch zu viele Werte in Bezug auf die Anzahl der Zielvariablen aufweist. Zum Beispiel: diese Arbeit und druckt 1, dann 2, dann 3

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

Dies führt jedoch zu Ihrem Fehler

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

erhöht

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

Nun, der Grund, warum dies in Ihrem Fall passiert, weiß ich nicht, aber vielleicht zeigt Ihnen diese Antwort die richtige Richtung.

Stefano Borini
quelle
1
@Sterfano Borini, ich erhalte auch einen ähnlichen Fehler, aber in meinem Fall erstelle ich eine Zeichenfolge, als obj='{"vendorId": "' + vID +'", "vendorName" :"'+vName+'", "addedDate" : "'+vAddedDate+'","usersList" : "'+ usersList + '," status" : "'+str(vStatus)+'","edit"'+edit+'"}';ob alle Werte Zeichenfolgen sind. Es gibt mir einen Fehler. Ich führe sie an der Python-Eingabeaufforderung aus, die ausgeführt wird, aber während ich die Antwort vom Web entgegennehme gibt mir diese Ausnahme. Kannst du bitte vorschlagen, was schief geht?
MegaBytes
Für alle, die es noch nicht verstanden haben (dh für mich), erklärt dieses Video genau das Gleiche ... mit Worten und Bildern, die mich irgendwie verständlich gemacht haben :)
Wesley Smith
Der Fehler bedeutet nicht unbedingt, tupledass a entpackt wird. Es kann ein beliebiger Sequenztyp sein. Es kann jeden iterierbaren Typ zulassen; Ich kann mich nicht ohne weiteres erinnern.
jpmc26
20

versuchen Sie in einer Variablen zu entpacken,

Python behandelt es als Liste,

dann aus der Liste auspacken

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
quelle
4
kann jemand mehr dazu erklären?
Huckepack
8

Dieses Problem kam mir bekannt vor und ich dachte, ich würde sehen, ob ich aus der begrenzten Menge an Informationen replizieren könnte.

Eine schnelle Suche ergab einen Eintrag in James Bennetts Blog , in dem erwähnt wird, dass bei der Arbeit mit dem UserProfile zur Erweiterung des Benutzermodells ein häufiger Fehler in settings.py dazu führen kann, dass Django diesen Fehler auslöst.

So zitieren Sie den Blogeintrag:

Der Wert der Einstellung ist nicht "appname.models.modelname", sondern nur "appname.modelname". Der Grund ist, dass Django dies nicht für einen direkten Import verwendet. Stattdessen wird eine interne Modellladefunktion verwendet, die nur den Namen der App und den Namen des Modells enthält. Wenn Sie versuchen, Dinge wie "appname.models.modelname" oder "projectname.appname.models.modelname" in der Einstellung AUTH_PROFILE_MODULE auszuführen, wird Django mit dem gefürchteten Fehler "Zu viele Werte zum Entpacken" in die Luft gesprengt Geben Sie "appname.modelname" und sonst nichts in den Wert von AUTH_PROFILE_MODULE ein.

Wenn das OP mehr von dem Traceback kopiert hätte, würde ich so etwas wie das sehen, unter dem ich duplizieren konnte, indem ich meiner Einstellung AUTH_PROFILE_MODULE "Modelle" hinzufügte.

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

Ich denke, dies ist einer der wenigen Fälle, in denen Django immer noch ein bisschen Importmagie hat, die zu Verwirrung führt, wenn ein kleiner Fehler nicht die erwartete Ausnahme auslöst.

Sie können am Ende des Tracebacks sehen, dass die Verwendung von etwas anderem als dem Formular "appname.modelname" für AUTH_PROFILE_MODULE dazu führen würde, dass die Zeile "app_label, model_name = settings.AUTH_PROFILE_MODULE.split ('.')" Das auslöst Fehler "Zu viele Werte zum Entpacken".

Ich bin mir zu 99% sicher, dass dies das ursprüngliche Problem war, auf das hier gestoßen wurde.

Hylidan
quelle
Was passiert, wenn Sie nicht AUTH_PROFILE_MODULEin Ihrem haben settings.py?
Sevenearths
0

Höchstwahrscheinlich liegt irgendwo im Aufruf von get_profile () ein Fehler vor. Fügen Sie Ihrer Ansicht nach folgende Zeile ein, bevor Sie das Anforderungsobjekt zurückgeben:

request.user.get_profile()

Es sollte den Fehler auslösen und Ihnen einen detaillierteren Traceback geben, den Sie dann zum weiteren Debuggen verwenden können.

Priester
quelle
0

Dies passiert mir, wenn ich Jinja2 für Vorlagen verwende. Das Problem kann gelöst werden, indem der Entwicklungsserver mit dem runserver_plusBefehl von django_extensions ausgeführt wird .

Es verwendet den werkzeug Debugger, der auch viel besser ist und eine sehr schöne interaktive Debugging-Konsole hat. Es macht Ajax-Magie, eine Python-Shell in einem beliebigen Frame (im Aufrufstapel) zu starten, damit Sie debuggen können.

hasen
quelle