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


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()

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


0

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

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.