django错误 '值过多无法解包

25 投票
8 回答
48916 浏览
提问于 2025-04-15 11:51

我正在通过构建一个简单的食谱应用来学习Django。我创建了一个表格模型,使用了“选择”字段选项来表示食谱类别,而不是使用第二个“类别”表和外键关系。所以我通过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

如果有人能帮我解释一下这个难懂的错误,那就太好了。我的数据库是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 个回答

1

如果让我猜的话,可能是因为管理模板里需要的是一个元组的列表,但你给的是一个元组的元组(所以才会出现“值太多”的错误)。你可以试着换成一个列表来看看:

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

你应该用一个 ChoiceField 来代替 SmallIntegerField

22

编辑:根据kibibu的更正进行了更新。

我遇到了一个我认为是相同的错误,出现了以下信息:

Caught ValueError while rendering: too many values to unpack

我的表单类如下:

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

注意,我这里的choices类型是一个元组。Django的官方文档对choices参数的说明如下:

一个可迭代的对象(例如,一个列表或元组),包含2个元素的元组,用作该字段的选择。这个参数接受与模型字段的choices参数相同的格式。

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

这个问题是通过查看文档并使用元组列表来解决的:

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

请注意,虽然文档说明可以使用任何正确格式的可迭代对象,但2个元组的元组并没有成功:

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

这产生了与之前相同的错误。

教训:错误是常有的事。

撰写回答