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
Ответ 4
Per http://code.djangoproject.com/ticket/972, вам нужно переместить назначение CATEGORY_CHOICES = ...
вне инструкции class
.
Ответ 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