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


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.