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

116

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

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

Окружающая среда:

Метод запроса: ПОЛУЧИТЬ
URL-адрес запроса: http: // localhost: 8000 /
Версия Django: 1.1
Версия Python: 2.6.1

Ошибка шаблона:
В шаблоне /path/to/base.tpl ошибка в строке 19
   Исключение при рендеринге: слишком много значений для распаковки

19: Здравствуйте, {{user.username}} ({{user.get_profile.rep}}). Как дела? Выйти


Тип исключения: TemplateSyntaxError в /
Значение исключения: обнаружено исключение при рендеринге: слишком много значений для распаковки

Есть идеи относительно того, что происходит или что я делаю не так?

Стив Гаттузо
источник
3
Не хватает информации. Пожалуйста, опубликуйте свою модель UserProfile.
Дэниел Роузман,

Ответы:

190

Это исключение означает, что вы пытаетесь распаковать кортеж, но в кортеже слишком много значений по отношению к количеству целевых переменных. Например: эта работа и печатает 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, он работает, но при получении ответа из Интернета он дает мне это исключение. Подскажите, пожалуйста, что не так.
MegaBytes
Для тех, кто все еще не понял (то есть меня), это видео объясняет то же самое ... словами и изображениями, которые каким-то образом заставили меня понять :)
Уэсли Смит
Ошибка не обязательно означает, tupleчто файл распаковывается. Это может быть любой тип последовательности. Это может допускать любой итеративный тип; Не могу вспомнить без промедления.
jpmc26
20

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

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
Ахмад Дваик
источник
4
может кто-нибудь объяснить больше по этому поводу?
контрейлерный
8

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

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

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

Значение параметра - не «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% уверен, что это была первоначальная проблема.

Хилидан
источник
Что произойдет, если вы не попали AUTH_PROFILE_MODULEв свой settings.py?
Роберт Джонстон
0

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

request.user.get_profile()

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

priestc
источник
0

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

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

Hasen
источник