Виключення "Занадто багато значень для розпакування"


116

Я працюю над проектом у Django, і я тільки почав намагатися розширити модель користувача, щоб створити профілі користувачів.

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

Середовище:

Метод запиту: GET
URL-адреса запиту: http: // localhost: 8000 /
Версія Джанго: 1.1
Версія Python: 2.6.1

Помилка шаблону:
У шаблоні /path/to/base.tpl помилка в рядку 19
   Трапився виняток під час надання: занадто багато значень для розпакування

19: Привіт, {{user.username}} ({{user.get_profile.rep}}). Як це йде? Вийти


Тип винятку: TemplateSyntaxError у /
Значення винятку: під час візуалізації потрапив виняток: занадто багато значень для розпакування

Будь-які ідеї щодо того, що відбувається або що я роблю неправильно?


3
Недостатньо інформації. Будь ласка, опублікуйте свою модель UserProfile.
Даніель Роузмен

Відповіді:


189

Цей виняток означає, що ви намагаєтесь розпакувати кортеж, але кортеж має занадто багато значень щодо кількості цільових змінних. Наприклад: ця робота і друкує 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 підірветься з жахливою помилкою "занадто багато значень, щоб розпакувати", тому переконайтеся, що ви помістіть у значення AUTH_PROFILE_MODULE значення "appname.modelname" та нічого іншого.

Якби ОП скопіювала більшу частину прослідковування, я очікував би, що я побачу щось подібне до того, яке я міг дублювати, додавши "моделі" до моєї настройки 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?
Sevenearths

0

Швидше за все, десь у виклику get_profile () є помилка. Перш ніж повернути об’єкт запиту, на ваш погляд, поставте цей рядок:

request.user.get_profile()

Це повинно призвести до помилки та надати більш детальне відстеження, яке потім можна використовувати для подальшої налагодження.


0

Це трапляється зі мною, коли я використовую Jinja2 для шаблонів. Проблему можна вирішити, запустивши сервер розробки за допомогою runserver_plusкоманди з django_extensions .

Він використовує налагоджувач werkzeug, який також набагато краще і має дуже хорошу інтерактивну консоль налагодження. Це робить деяку магію ajax, щоб запустити оболонку пітона в будь-який кадр (у стеці викликів), щоб ви могли налагоджувати.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.