【问题标题】:django error 'too many values to unpack'django错误'解包的值太多'
【发布时间】:2010-10-29 03:41:57
【问题描述】:

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

【问题讨论】:

  • 除非 Django 开发版有 bug,否则这看起来没什么问题。您是否有机会在某处拥有自定义管理模板或 ModelAdmin 定义?

标签: python django sqlite


【解决方案1】:

当函数返回三个值并将其分配给 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()

【讨论】:

    【解决方案2】:

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

    我遇到了我认为是同样的错误,产生了以下消息:

    Caught ValueError while rendering: too many values to unpack
    

    我的表单类如下:

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

    请注意,我的choices 在此处输入一个元组。对于choices arg,Django 官方文档如下:

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

    源代码: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')))
    

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

    教训:错误发生了。

    【讨论】:

    • 元组列表也适用于我。选择=[('a_val','a'),('b_val','b')]。谢谢!
    • item = forms.ChoiceField(choices=(('17815', '17816'))) 不是元组的元组。它是括号中的元组。你需要做item = forms.ChoiceField(choices=(('17815', '17816'),))。注意逗号。当然,您的第二个示例是正确的格式,但仍然无法正常工作。
    【解决方案3】:

    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

    【讨论】:

    • 关于它更 Pythonic,不,不是真的。元组是不可变的;一旦创建就无法更改。选择列表通常应该保持不变,这就是建议使用元组的原因。
    • 更 Pythonic,在这种情况下,我的意思是更具可读性。 forms.ChoiceField(choices=(('17815', '17816'),)) 有很多括号,它可能会混淆什么是元组和什么是函数调用。通过使用列表而不是元组,它更明显:forms.ChoiceField(choices=[('17815', '17816')])。您对元组和列表之间的区别是正确的,但我认为我们可以相信 Django 不会在此处更改列表。事实上,它的文档明确说允许任何可迭代并显示一个带有列表的示例:docs.djangoproject.com/en/dev/ref/models/fields/#choices
    【解决方案4】:

    您应该使用ChoiceField 而不是SmallIntegerField

    【讨论】:

      【解决方案5】:

      我只是遇到了同样的问题...我的 cvs 文件来自 ms excel,并且在保存时间时日期字段的格式错误。我将格式更改为“2010-05-04 13:05:46.790454”(excel 给了我 2010 年 5 月 5 日 10:05:47)之类的格式,瞧,不再有“太多的值无法解压”

      【讨论】:

        【解决方案6】:

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

        谢谢。

        【讨论】:

        • 我不得不说,这不是一个非常令人满意的答案。我更感兴趣的是知道如何解决问题(以及问题是什么),而不是解决方法。毕竟,如果再次发生会怎样?但我很高兴您能够找到适合您的解决方案。
        • 这里我遇到了同样的问题:“解压的值太多” 我查看了异常堆栈,发现问题发生在时间戳的“拆分”操作上。时间戳编码错误,因为数据直接插入到 sqlite shell 中。 django 给我们的信息并不是真正问题的好线索,只是它。 ;)
        【解决方案7】:

        根据 http://code.djangoproject.com/ticket/972 ,您需要将赋值 CATEGORY_CHOICES = ... 移出 class 语句。

        【讨论】:

          【解决方案8】:

          如果我不得不猜测,那是因为管理模板中的任何内容都需要一个元组列表,但您却提供了一个元组的元组(因此“值太多”)。尝试用列表替换:

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

          【讨论】:

          猜你喜欢
          • 2013-12-14
          • 2018-12-19
          • 1970-01-01
          • 2019-06-07
          • 2012-02-15
          • 1970-01-01
          • 1970-01-01
          • 2017-10-17
          • 1970-01-01
          相关资源
          最近更新 更多