django错误'太多值解包'

问题描述 投票:19回答:8

我正在通过构建一个简单的食谱应用程序来学习Django。我有一个1表模型,使用配方类别的'choices'字段选项,而不是使用第二'类别'表和外键关系。所以我通过syncdb创建了db表,然后用测试数据加载了表。当我去管理员并点击“食谱”链接以尝试查看食谱时,我收到以下错误:

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)
python django sqlite
8个回答
19
投票

编辑:根据kibibu的修正更新。

我遇到了我认为是同样的错误,产生了这样的信息:

Caught ValueError while rendering: too many values to unpack

我的表格类如下:

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

请注意,我的choices在这里输入一个元组。 Django官方文档的内容如下:choices arg:

2元组的可迭代(例如,列表或元组),用作该字段的选择。此参数接受与模型字段的choices参数相同的格式。

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

请注意,虽然文档声明可以使用任何正确形式的迭代,但是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'),        
]

2
投票

你应该使用ChoiceField而不是SmallIntegerField


1
投票

根据http://code.djangoproject.com/ticket/972,你需要在CATEGORY_CHOICES = ...声明之外移动任务class


0
投票

我搞定了。我在谷歌搜索时遇到的“太多值解包”错误的大部分都是值错误类型。我的错误是模板语法类型。要加载我的配方表,我导入了一个csv文件。我想也许在导入时sqlite允许的数据中存在问题。所以我删除了所有数据,然后通过django管理表单手动添加了2个食谱。之后加载的食谱列表。

谢谢。


0
投票

我只是遇到了同样的问题......我的cvs文件来自ms excel,日期字段在节省时间时格式错误。我将格式更改为'2010-05-04 13:05:46.790454'(excel给了我5/5/2010 10:05:47)并且voilaaaa没有'太多的值来解压'


0
投票

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


0
投票

当函数返回三个值并将其分配给2时,会发生此错误IMO。例如:

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

© www.soinside.com 2019 - 2024. All rights reserved.