我正在通过构建一个简单的食谱应用程序来学习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)
答案 0 :(得分:18)
编辑:根据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元组的可迭代(例如,列表或元组) 这个领域。此参数接受与选项相同的格式 模型字段的参数。
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')))
这产生了与以前相同的错误。
课程:错误发生。
答案 1 :(得分: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 :(得分:2)
您应该使用ChoiceField
代替SmallIntegerField
答案 3 :(得分:1)
根据http://code.djangoproject.com/ticket/972,您需要将作业CATEGORY_CHOICES = ...
移到 class
语句之外。
答案 4 :(得分:0)
我得到了它的工作。我在谷歌搜索时遇到的“太多值解包”错误的大部分都是值错误类型。我的错误是模板语法类型。要加载我的配方表,我导入了一个csv文件。我想也许在导入时sqlite允许的数据中存在问题。所以我删除了所有数据,然后通过django管理表单手动添加了2个食谱。之后加载的食谱列表。
感谢。
答案 5 :(得分:0)
我遇到了同样的问题...我的cvs文件来自ms excel,日期字段在节省时间时格式错误。我将格式更改为'2010-05-04 13:05:46.790454'(excel给了我5/5/2010 10:05:47),并且不再有太多的值来解压'
答案 6 :(得分:0)
在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
答案 7 :(得分: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