Исключение «слишком много значений для распаковки»

82

Я работаю над проектом в Django, и я только начал пытаться расширить модель User, чтобы создавать профили пользователей.

К сожалению, у меня возникла проблема: каждый раз, когда я пытаюсь получить профиль пользователя внутри шаблона (например, user.get_template.lastIP), я получаю следующую ошибку:

Environment:

Request Method: GET
Request URL: http://localhost:8000/
Django Version: 1.1
Python Version: 2.6.1

Template error:
In template /path/to/base.tpl, error at line 19
   Caught an exception while rendering: too many values to unpack

19 :                Hello, {{user.username}} ({{ user.get_profile.rep}}). How it goin? Logout


Exception Type: TemplateSyntaxError at /
Exception Value: Caught an exception while rendering: too many values to unpack

Любые идеи относительно того, что происходит или что я делаю неправильно?

  • 3
    Не хватает информации. Пожалуйста, опубликуйте свою модель UserProfile.
Теги:

5 ответов

149
Лучший ответ

Это исключение означает, что вы пытаетесь распаковать кортеж, но кортеж имеет слишком много значений в отношении количества целевых переменных. Например: эта работа и печатает 1, затем 2, затем 3

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

Но это вызывает вашу ошибку

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

повышений

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

Теперь, почему это происходит в вашем случае, я не знаю, но, возможно, этот ответ укажет вам в правильном направлении.

  • 1
    @Sterfano Borini, я получаю аналогичную ошибку, но в моем случае я создаю строку как obj='{"vendorId": "' + vID +'", "vendorName" :"'+vName+'", "addedDate" : "'+vAddedDate+'","usersList" : "'+ usersList + '," status" : "'+str(vStatus)+'","edit"'+edit+'"}'; хотя все значения являются строковыми, я получаю сообщение об ошибке, я запускаю его по приглашению python, но он принимает это исключение, принимая ответ из Интернета. Можете ли вы предложить, что происходит не так.
  • 0
    Для любого, кто все еще не понял (то есть меня), это видео объясняет ту же самую вещь ... словами и картинками, которые так или иначе заставили меня понять :)
Показать ещё 1 комментарий
15

попробуйте распаковать в одну переменную,

python будет обрабатывать его как список,

затем распакуйте из списка

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
  • 0
    Спасибо, это спасло мне жизнь при попытке диагностировать неожиданную ошибку в IronPython при возврате из отчета.
  • 4
    Может кто-нибудь объяснить больше об этом?
Показать ещё 4 комментария
8

Эта проблема выглядела знакомой, поэтому я подумал, что посмотрю, смогу ли я воспроизвести ее из ограниченного объема информации.

Быстрый поиск показал запись в блоге Джеймса Беннетта здесь, в котором упоминается, что при работе с UserProfile для расширения модели пользователя распространенная ошибка в settings.py может вызвать Django для этой ошибки.

Процитировать запись в блоге:

Значение параметра не "appname.models.modelname", а просто "appname.modelname" . Причина в том, что Django не использует это для прямого импорта; вместо этого он использует внутреннюю функцию загрузки модели, которая хочет только имя приложения и имя модели. Попытка сделать что-то вроде "appname.models.modelname" или "projectname.appname.models.modelname" в настройке AUTH_PROFILE_MODULE приведет к тому, что Django взорвется с ошибкой "слишком много значений для распаковки", поэтому убедитесь, что вы поместите "appname.modelname" и ничего больше, в значение AUTH_PROFILE_MODULE.

Если OP скопировал больше трассировки, я бы ожидал увидеть что-то вроде того, которое ниже, которое я смог дублировать, добавив "модели" в мой параметр 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

Это, я думаю, является одним из немногих случаев, когда Django по-прежнему имеет небольшую магию импорта, которая, как правило, вызывает путаницу, когда небольшая ошибка не генерирует ожидаемое исключение.

В конце трассировки, который я опубликовал, вы можете увидеть, как использование ничего, кроме формы "appname.modelname" для AUTH_PROFILE_MODULE, приведет к строке "app_label, model_name = settings.AUTH_PROFILE_MODULE.split('.')" для сброса ошибки "слишком много значений для распаковки".

Я на 99% уверен, что это была оригинальная проблема, встречающаяся здесь.

  • 0
    Что произойдет, если у вас нет AUTH_PROFILE_MODULE в вашем settings.py ?
0

Это происходит со мной, когда я использую Jinja2 для шаблонов. Проблема может быть решена путем запуска сервера разработки с помощью команды runserver_plus из django_extensions.

Он использует werkzeug отладчик, который также оказывается намного лучше и имеет очень приятную интерактивную консоль отладки. Он использует некоторую магию ajax для запуска оболочки python в любом кадре (в стеке вызовов), чтобы вы могли отлаживать.

0

Скорее всего, есть ошибка где-то в вызове get_profile(). На ваш взгляд, прежде чем вы вернете объект запроса, поместите эту строку:

request.user.get_profile()

Он должен поднять ошибку и дать вам более подробную трассировку, которую затем можно использовать для дальнейшей отладки.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню