ошибка django 'слишком много значений для распаковки' - PullRequest
20 голосов
/ 27 мая 2009

Я изучаю Django, создав простое приложение с рецептами. У меня есть модель с 1 таблицей, использующая параметр поля «выборы» для категорий рецептов, а не 2-ую таблицу «категории» и отношение внешнего ключа. Поэтому я создал таблицу БД через syncdb, а затем загрузил таблицу с тестовыми данными. Когда я захожу в администратор и нажимаю на ссылку «Рецепты» в попытке просмотреть рецепты, я получаю следующую ошибку:

Template error

In template /var/lib/python-support/python2.6/django/contrib/admin/templates/admin/change_list.html, error at line 34
Caught an exception while rendering: too many values to unpack

Если кто-нибудь сможет пролить свет на эту загадочную ошибку, это было бы здорово. Db является Sqlite. Версия Django - 1.0. Модель указана ниже:

from django.db import models

class Recipe(models.Model):
    CATEGORY_CHOICES = (
        (1, u'Appetizer'),
        (2, u'Bread'),
        (3, u'Dessert'),
        (4, u'Drinks'),
        (5, u'Main Course'),
        (6, u'Salad'),
        (7, u'Side Dish'),
        (8, u'Soup'),
        (9, u'Sauce/Marinade'),
        (10, u'Other'),        
    )
    name = models.CharField(max_length=255)
    submitter = models.CharField(max_length=40)
    date = models.DateTimeField()
    category = models.SmallIntegerField(choices=CATEGORY_CHOICES)
    ingredients = models.TextField()
    directions = models.TextField()
    comments = models.TextField(null=True, blank=True)

Ответы [ 8 ]

19 голосов
/ 21 ноября 2011

Редактировать: Обновлено в свете исправления кибибу.

Я столкнулся с той же ошибкой, которая вызвала сообщение:

Caught ValueError while rendering: too many values to unpack

Мой класс был таким:

class CalcForm(forms.Form):
    item = forms.ChoiceField(choices=(('17815', '17816')))

Обратите внимание, что мой choices тип здесь кортеж. Официальная документация Django гласит: choices arg:

Итерация (например, список или кортеж) из двух кортежей для использования в качестве выбора для это поле. Этот аргумент принимает те же форматы, что и варианты Аргумент к модельному полю.

Источник: https://docs.djangoproject.com/en/1.3/ref/forms/fields/#django.forms.ChoiceField.choices

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

class CalcForm(forms.Form):
    item = forms.ChoiceField(choices=[('17815', '17816')])

Обратите внимание, что хотя в состоянии документации можно использовать любую итерацию правильной формы, кортеж из двух кортежей не работает:

item = forms.ChoiceField(choices=(('17815', '17816'), ('123', '456')))

Произошла та же ошибка, что и раньше.

Урок: ошибки случаются.

2 голосов
/ 13 мая 2011

Вы должны использовать ChoiceField вместо SmallIntegerField

2 голосов
/ 27 мая 2009

Если бы мне пришлось угадывать, это потому, что все, что находится в административном шаблоне, ожидает список кортежей, но вы вместо этого предоставили кортеж кортежей (отсюда и «слишком много значений»). Попробуйте заменить на список вместо:

CATEGORY_CHOICES = [    # Note square brackets.
    (1, u'Appetizer'),
    (2, u'Bread'),
    (3, u'Dessert'),
    (4, u'Drinks'),
    (5, u'Main Course'),
    (6, u'Salad'),
    (7, u'Side Dish'),
    (8, u'Soup'),
    (9, u'Sauce/Marinade'),
    (10, u'Other'),        
]
1 голос
/ 27 мая 2009

За http://code.djangoproject.com/ticket/972, вам нужно переместить присваивание CATEGORY_CHOICES = ... за пределы оператора class.

0 голосов
/ 12 апреля 2019

Эта ошибка IMO возникает, когда функция возвращает три значения, и вы присваиваете ей значение 2. Например ::

def test():
    a=0
    b=0
    c=0
.... 
a,b=test() <---three values returned, but only assigning to 2.

a, b, c = test () <--- возвращены три значения, присвоенные 3.OK </p>

0 голосов
/ 10 октября 2013

Комментарий кибибу к ответу Крейчека верен. Это не проблема Django, а скорее интересный аспект Python. Подведем итог:

В Python круглые скобки используются как для порядка операций, так и для кортежей. Итак:

foo = (2+2)

приведет к тому, что foo будет 4, а не кортеж, который первым и единственным элементом будет 4: 4

foo = (2+2, 3+3)

приведет к тому, что foo будет двумерным кортежем: (4,6)

Чтобы сообщить Python, что вы хотите создать одномерный кортеж, а не просто обозначать порядок операций, используйте запятую:

foo = (2+2,)

приведет к тому, что foo будет одномерным кортежем, первый и единственный элемент которого равен 4: (4,)

Итак, для вашего сценария:

class CalcForm(forms.Form):
    item = forms.ChoiceField(choices=(('17815', '17816'),))

даст то, что вы хотите. Использование списка также является отличным решением (на мой взгляд, более Pythonic), но, надеюсь, этот ответ будет информативным, поскольку он может возникнуть в других случаях.

Например:

print("foo: %s" % (foo))

может выдавать ошибку, если foo является итеративным, но:

print("foo: %s" % (foo,))

или

print("foo: %s" % [foo])

будет правильно преобразовывать foo в строку независимо от того, является ли она итеративной или нет.

Документация: http://docs.python.org/2/tutorial/datastructures.html#tuples-and-sequences

0 голосов
/ 06 мая 2010

У меня просто была такая же проблема ... мой cvs-файл пришел из ms excel, а поля даты получили неправильный формат при экономии времени. Я изменяю формат на что-то вроде «2010-05-04 13: 05: 46.790454» (Excel дал мне 5/5/2010 10:05:47) и вуаля не более «слишком много значений для распаковки»

0 голосов
/ 27 мая 2009

Я получил это работает. Большинство ошибок «слишком много значений для распаковки», с которыми я сталкивался во время поиска в Google, были типами Value Error. Моя ошибка была типом синтаксиса шаблона. Чтобы загрузить таблицу рецептов, я импортировал CSV-файл. Я подумала, может быть, где-то возникла проблема с данными, разрешенными sqlite при импорте. Поэтому я удалил все данные и затем добавил 2 рецепта вручную через форму администратора django. Список рецептов, загруженных после этого.

спасибо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...