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



Я работаю над проектом, в 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's it goin? Logout


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



идеи о том, что происходит или что я делаю неправильно?

890   5  

5 ответов:

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

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

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

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

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

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

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

значение параметра не является " appname.модели.modelname", это просто " имя приложения.modelname". Причина в том, что Django не использует это для прямого импорта; вместо этого он использует внутреннюю функцию загрузки модели, которая хочет только имя приложения и имя модели. Пытаясь делать такие вещи, как " appname.модели.modelname " или " projectname.имя приложения.модели.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 все еще есть немного магии импорта, которая имеет тенденцию вызывать путаницу, когда небольшая ошибка не вызывает ожидаемого исключения.

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

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

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

request.user.get_profile()

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

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

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

Comments

    Ничего не найдено.