【问题标题】:Django: ValueError: too many values to unpackDjango:ValueError:解包的值太多
【发布时间】:2013-01-15 23:21:21
【问题描述】:

我得到了一个 ValueError,我无法终生解决这个错误。我知道该错误意味着传递给变量的值比预期的要多(即(x, y) = 1, 2, 3),但我不明白这里为什么会出现问题。

这是错误所在(在 views.py 文件中):

## image_pks is just a list of ImageItem primary keys (eg, [1, 2] or [5])
queryset = ImageItem.objects.filter(pk__in=image_pks)
ImageInfoFormset = modelformset_factory(ImageItem, fields=('title', 'caption'), extra=0)
formset = ImageInfoFormset(queryset) ## Error happening here!!!

这是 ImageItem 模型的样子:

class ImageItem(models.Model):
    user = models.ForeignKey(User)
    upload_date = models.DateTimeField(auto_now_add=True)
    last_modified = models.DateTimeField(auto_now=True)
    library = models.ForeignKey(Library)
    img_big = models.ImageField(upload_to=img_get_file_path)
    img_363 = models.ImageField(upload_to=img_get_file_path)
    title = models.CharField(max_length=50,
                             blank=True)
    caption = models.CharField(max_length=1000,
                               blank=True)

这是关于traceback的信息:

以下是回溯中的局部变量:

如果你们需要更多信息,请告诉我,谢谢!

编辑:这是提供的整个回溯:

Traceback:
File "/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/django/core/handlers/base.py" in get_response
  111.                         response = callback(request, *callback_args, **callback_kwargs)
File "/Users/sgarza62/riotry_master/riotry/backboard_general/views.py" in Backboard_Home
  44.                 formset = ImageInfoFormset(queryset) # TOO MANY VALUES ERROR HERE!
File "/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/django/forms/models.py" in __init__
  424.         super(BaseModelFormSet, self).__init__(**defaults)
File "/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/django/forms/formsets.py" in __init__
  50.         self._construct_forms()
File "/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/django/forms/formsets.py" in _construct_forms
  114.         for i in xrange(self.total_form_count()):
File "/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/django/forms/formsets.py" in total_form_count
  88.             return self.management_form.cleaned_data[TOTAL_FORM_COUNT]
File "/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/django/forms/formsets.py" in _management_form
  74.             if not form.is_valid():
File "/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/django/forms/forms.py" in is_valid
  124.         return self.is_bound and not bool(self.errors)
File "/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/django/forms/forms.py" in _get_errors
  115.             self.full_clean()
File "/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/django/forms/forms.py" in full_clean
  270.         self._clean_fields()
File "/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/django/forms/forms.py" in _clean_fields
  281.             value = field.widget.value_from_datadict(self.data, self.files, self.add_prefix(name))
File "/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/django/forms/widgets.py" in value_from_datadict
  205.         return data.get(name, None)
File "/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/django/db/models/query.py" in get
  358.         clone = self.filter(*args, **kwargs)
File "/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/django/db/models/query.py" in filter
  624.         return self._filter_or_exclude(False, *args, **kwargs)
File "/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/django/db/models/query.py" in _filter_or_exclude
  642.             clone.query.add_q(Q(*args, **kwargs))
File "/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/django/db/models/sql/query.py" in add_q
  1250.                             can_reuse=used_aliases, force_having=force_having)
File "/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/django/db/models/sql/query.py" in add_filter
  1056.         arg, value = filter_expr

Exception Type: ValueError at /backboard/
Exception Value: too many values to unpack

编辑 2: 我正在玩它,并且发生了一些奇怪的事情。当我将 queryset = ImageItem.objects.filter(pk__in=image_pks) 行更改为 queryset = ImageItem.objects.get(pk=10)(其中 10 是任意 id)时,我收到以下错误:AttributeError: 'ImageItem' object has no attribute 'get'原来有问题的行抛出错误! p>

这是一个奇怪的错误,因为 ImageItem 只是一个正常的模型。当然它有属性'get'。这是否与首先在有问题的行(formset = ImageInfoFormset(queryset))上评估查询集的事实有关? ImageItem 是否在编写查询之后但在评估之前分配给其他东西?

【问题讨论】:

  • 我怀疑您的线路是否正确;该行没有进行变量解包。
  • 那是回溯发出信号的那条线(我已经改变了一些东西来测试,它一直告诉我问题出在那条线上)。当查询集作为参数传递给ImageInfoFormset 时,是否会进行解包?
  • 不在那个确切的行上,不。
  • 那么ImageInfoFormat(queryset)返回了什么?
  • @PeterRowell:这也没关系;返回值被分配给 one 变量。我怀疑这个回溯比这里显示的更多。

标签: python django debugging django-forms django-queryset


【解决方案1】:

我会尝试使用 `formset = ImageInfoFormset(queryset.values())

formset = ImageInfoFormset(queryset.values())

而不是

formset = ImageInfoFormset(queryset)

【讨论】:

  • 仍然得到相同的错误,具有相同的确切回溯。还有其他想法吗?
【解决方案2】:

尝试摆脱 queryset= 定义(您的第一行)并改为执行以下操作:

ImageInfoFormset = modelformset_factory(ImageItem, fields=('title', 'caption'), extra=0)
formset = ImageInfoFormset(queryset=ImageItem.objects.filter(pk__in=image_pks))

您必须明确定义您正在更改查询集,否则您只是将另一个变量传递给表单集。

请参阅文档here.

【讨论】:

  • 天哪,成功了!卡在这个bug上很久了,非常感谢。您能解释一下区别是什么,以及为什么会导致问题吗?还有,queryset 在这种情况下缓存了吗?
  • 添加了文档的解释和链接。基本上,您只是发送另一个变量而不是覆盖默认查询集。
猜你喜欢
  • 1970-01-01
  • 2016-05-11
  • 2014-10-19
  • 2018-03-21
  • 2019-06-07
  • 2012-02-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多