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

Я работаю над проектом в 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

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

Ответ 1

Это исключение означает, что вы пытаетесь распаковать кортеж, но кортеж имеет слишком много значений в отношении количества целевых переменных. Например: эта работа и печатает 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

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

Ответ 2

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

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

Ответ 3

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

Быстрый поиск показал запись в блоге Джеймса Беннетта здесь, в котором упоминается, что при работе с 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% уверен, что это была оригинальная проблема, встречающаяся здесь.

Ответ 4

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

request.user.get_profile()

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

Ответ 5

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

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