Wyjątek „Za dużo wartości do rozpakowania”


116

Pracuję nad projektem w Django i właśnie zacząłem próbować rozszerzyć model użytkownika o tworzenie profili użytkowników.

Niestety napotkałem problem: za każdym razem, gdy próbuję uzyskać profil użytkownika w szablonie ( user.get_template.lastIPna przykład), pojawia się następujący błąd:

Środowisko:

Metoda żądania: POBIERZ
URL żądania: http: // localhost: 8000 /
Wersja Django: 1.1.0
Wersja Pythona: 2.6.1

Błąd szablonu:
W szablonie /path/to/base.tpl, błąd w linii 19
   Złapany wyjątek podczas renderowania: zbyt wiele wartości do rozpakowania

19: Witaj, {{nazwa_użytkownika}} ({{user.get_profile.rep}}). Jak leci? Wyloguj


Typ wyjątku: TemplateSyntaxError w /
Wartość wyjątku: przechwycono wyjątek podczas renderowania: zbyt wiele wartości do rozpakowania

Jakieś pomysły, co się dzieje lub co robię źle?


3
Za mało informacji. Opublikuj swój model profilu użytkownika.
Daniel Roseman,

Odpowiedzi:


190

Ten wyjątek oznacza, że ​​próbujesz rozpakować krotkę, ale krotka ma zbyt wiele wartości w stosunku do liczby zmiennych docelowych. Na przykład: ta praca i drukuje 1, potem 2, potem 3

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

Ale to podnosi twój błąd

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

podnosi się

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

Nie wiem, dlaczego tak się dzieje w twoim przypadku, ale może ta odpowiedź wskaże ci właściwy kierunek.


1
@Sterfano Borini, dostaję również podobny błąd, ale w moim przypadku tworzę ciąg, ponieważ obj='{"vendorId": "' + vID +'", "vendorName" :"'+vName+'", "addedDate" : "'+vAddedDate+'","usersList" : "'+ usersList + '," status" : "'+str(vStatus)+'","edit"'+edit+'"}';chociaż wszystkie wartości są ciągami, to daje mi błąd, uruchamiam go na monit Pythona, ale działa, ale podczas pobierania odpowiedzi z sieci to daje mi ten wyjątek. czy możesz zasugerować, co się dzieje.
MegaBytes

Dla każdego, kto nadal tego nie rozumiał (tj. Dla mnie), ten film wyjaśnia dokładnie to samo ... słowami i obrazami, które jakoś mnie zrozumiały :)
Wesley Smith

Błąd nie musi oznaczać, że plik tuplejest rozpakowywany. Może to być dowolny typ sekwencji. Może dopuścić dowolny iterowalny typ; Nie mogę sobie przypomnieć z ręki.
jpmc26

20

spróbuj rozpakować w jednej zmiennej,

Python potraktuje to jako listę,

następnie wypakuj z listy

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
czy ktoś może wyjaśnić więcej na ten temat?
barana

8

Ten problem wyglądał znajomo, więc pomyślałem, że sprawdzę, czy uda mi się odtworzyć na podstawie ograniczonej ilości informacji.

Szybko okazało się wpis w blogu James Bennetta o którym wspomina, że podczas pracy z UserProfile rozszerzenie modelu użytkownika częstym błędem w settings.py Django może spowodować, aby rzucić ten błąd.

Cytując wpis na blogu:

Wartością tego ustawienia nie jest „nazwa_aplikacji.models.modelname”, tylko „nazwaaplikacji.modelname”. Powodem jest to, że Django nie używa tego do bezpośredniego importu; zamiast tego używa wewnętrznej funkcji ładowania modelu, która potrzebuje tylko nazwy aplikacji i nazwy modelu. Próba wykonania takich rzeczy jak „nazwa_aplikacji.models.modelname” lub „projectname.appname.models.modelname” w ustawieniu AUTH_PROFILE_MODULE spowoduje, że Django wyskoczy z przerażającym błędem „zbyt wiele wartości do rozpakowania”, więc upewnij się, że wstaw „nazwa_aplikacji.modelname” i nic więcej w wartości AUTH_PROFILE_MODULE.

Gdyby OP skopiował więcej danych śledzenia, spodziewałbym się zobaczyć coś podobnego do tego poniżej, które udało mi się skopiować, dodając „modele” do mojego ustawienia 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

Myślę, że jest to jeden z niewielu przypadków, w których Django wciąż ma trochę magii importu, która ma tendencję do wprowadzania zamieszania, gdy mały błąd nie powoduje wyrzucenia oczekiwanego wyjątku.

Możesz zobaczyć na końcu śledzenia, które opublikowałem, w jaki sposób użycie czegokolwiek innego niż formularz „nazwa_aplikacji.modelname” dla AUTH_PROFILE_MODULE spowoduje, że wiersz „app_label, model_name = settings.AUTH_PROFILE_MODULE.split ('.')” Wyrzuci Błąd „zbyt wiele wartości do rozpakowania”.

Jestem w 99% pewien, że był to pierwotny problem, który tu napotkano.


Co się stanie, jeśli nie masz AUTH_PROFILE_MODULEw swoim settings.py?
Sevenearths

0

Najprawdopodobniej gdzieś w wywołaniu get_profile () występuje błąd. Twoim zdaniem, zanim zwrócisz obiekt żądania, umieść tę linię:

request.user.get_profile()

Powinno to zgłosić błąd i dać bardziej szczegółowe śledzenie, którego można następnie użyć do dalszego debugowania.


0

Dzieje się tak, gdy używam Jinja2 do szablonów. Problem można rozwiązać, uruchamiając serwer deweloperski za pomocą runserver_pluspolecenia z django_extensions .

Używa debuggera werkzeug, który również jest o wiele lepszy i ma bardzo ładną interaktywną konsolę debugowania. Robi trochę magii Ajax, aby uruchomić powłokę Pythona w dowolnej ramce (w stosie wywołań), aby można było debugować.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.