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.