Django错误“要解包的值太多”

2024-05-12 13:38:54 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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)

Tags: django模型dbadminmodels错误table配方
3条回答

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

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

Caught ValueError while rendering: too many values to unpack

我的形式课如下:

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

注意我的choices在这里键入一个元组。Django的官方文档如下:

An iterable (e.g., a list or tuple) of 2-tuples to use as choices for this field. This argument accepts the same formats as the choices argument to a model field.

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

请注意,虽然文档声明可以使用正确形式的任何iterable,但2元组的元组不起作用:

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

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

教训:虫子会发生。

您应该使用ChoiceField,而不是SmallIntegerField

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

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

相关问题 更多 >