Django error 'слишком много значений для распаковки'

Я изучаю Django, создавая простое приложение для рецептов. У меня есть 1 табличная модель, использующая поле "выбор" для категорий рецептов, а не для использования таблицы "2 категории" и отношения внешнего ключа. Поэтому я создал таблицу db через 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)

Ответы

Ответ 1

Изменить: Обновлено в свете коррекции кибибу.

Я столкнулся с тем, что, по моему мнению, является такой же ошибкой, создавая сообщение:

Caught ValueError while rendering: too many values to unpack

Мой класс формы был следующим:

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

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

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

src: https://docs.djangoproject.com/en/1.3/ref/forms/fields/#django.forms.ChoiceField.choices

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

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

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

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

Это привело к той же ошибке, что и раньше.

Урок: ошибки происходят.

Ответ 2

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

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'),        
]

Ответ 3

Вместо SmallIntegerField

вы должны использовать ChoiceField

Ответ 5

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

спасибо.

Ответ 6

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

Ответ 7

kibibu комментарий к Kreychek ответ правильный. Это не проблема 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

Ответ 8

Эта ошибка 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() <---three возвращенные значения, присвоенные 3.OK