错误:“字典更新序列元素#0的长度为1;在Django 1.4上需要2


157

我在django 1.4上收到一条错误消息:

字典更新序列元素#0的长度为1;2个为必填项

[编辑]

当我尝试使用模板标签时发生了这种情况:`{%for v in values%}:

dictionary update sequence element #0 has length 1; 2 is required

Request Method:     GET
Request URL:    ...
Django Version:     1.4.5
Exception Type:     ValueError
Exception Value:    

dictionary update sequence element #0 has length 1; 2 is required

Exception Location:     /usr/local/lib/python2.7/dist-packages/djorm_hstore/fields.py in __init__, line 21
Python Executable:  /usr/bin/uwsgi-core
Python Version:     2.7.3
Python Path:    

['/var/www/',
 '.',
 '',
 '/usr/lib/python2.7',
 '/usr/lib/python2.7/plat-linux2',
 '/usr/lib/python2.7/lib-tk',
 '/usr/lib/python2.7/lib-old',
 '/usr/lib/python2.7/lib-dynload',
 '/usr/local/lib/python2.7/dist-packages',
 '/usr/lib/python2.7/dist-packages',
 '/usr/lib/python2.7/dist-packages/PIL',
 '/usr/lib/pymodules/python2.7']

Server time:    sam, 13 Jul 2013 16:15:45 +0200
Error during template rendering

In template /var/www/templates/app/index.html, error at line 172
dictionary update sequence element #0 has length 1; 2 is required

172     {% for product in products %}

Traceback Switch to copy-and-paste view

/usr/lib/python2.7/dist-packages/django/core/handlers/base.py in get_response

                            response = callback(request, *callback_args, **callback_kwargs)

    ...
 Local vars
/usr/lib/python2.7/dist-packages/django/contrib/auth/decorators.py in _wrapped_view

                    return view_func(request, *args, **kwargs)

    ...
 Local vars
/usr/lib/python2.7/dist-packages/django/views/decorators/http.py in inner

                return func(request, *args, **kwargs)

    ...
 Local vars
./app/views.py in index

            context_instance=RequestContext(request))

    ...
 Local vars
/usr/lib/python2.7/dist-packages/django/shortcuts/__init__.py in render_to_response

        return HttpResponse(loader.render_to_string(*args, **kwargs), **httpresponse_kwargs)

    ...
 Local vars
/usr/lib/python2.7/dist-packages/django/template/loader.py in render_to_string

            return t.render(context_instance)

    ...
 Local vars
/usr/lib/python2.7/dist-packages/django/template/base.py in render

                return self._render(context)

    ...
 Local vars
/usr/lib/python2.7/dist-packages/django/template/base.py in _render

            return self.nodelist.render(context)

    ...
 Local vars
/usr/lib/python2.7/dist-packages/django/template/base.py in render

                    bit = self.render_node(node, context)

    ...
 Local vars
/usr/lib/python2.7/dist-packages/django/template/debug.py in render_node

                return node.render(context)

    ...
 Local vars
/usr/lib/python2.7/dist-packages/django/template/loader_tags.py in render

            return compiled_parent._render(context)

    ...
 Local vars
/usr/lib/python2.7/dist-packages/django/template/base.py in _render

            return self.nodelist.render(context)

    ...
 Local vars
/usr/lib/python2.7/dist-packages/django/template/base.py in render

                    bit = self.render_node(node, context)

    ...
 Local vars
/usr/lib/python2.7/dist-packages/django/template/debug.py in render_node

                return node.render(context)

    ...
 Local vars
/usr/lib/python2.7/dist-packages/django/template/loader_tags.py in render

                result = block.nodelist.render(context)

    ...
 Local vars
/usr/lib/python2.7/dist-packages/django/template/base.py in render

                    bit = self.render_node(node, context)

    ...
 Local vars
/usr/lib/python2.7/dist-packages/django/template/debug.py in render_node

                return node.render(context)

    ...
 Local vars
/usr/lib/python2.7/dist-packages/django/template/defaulttags.py in render

            len_values = len(values)

    ...
 Local vars
/usr/lib/python2.7/dist-packages/django/core/paginator.py in __len__

            return len(self.object_list)

    ...
 Local vars
/usr/lib/python2.7/dist-packages/django/db/models/query.py in __len__

                    self._result_cache = list(self.iterator())

    ...
 Local vars
/usr/lib/python2.7/dist-packages/django/db/models/query.py in iterator

                        obj = model(*row[index_start:aggregate_start])

    ...
 Local vars
/usr/lib/python2.7/dist-packages/django/db/models/base.py in __init__

                    setattr(self, field.attname, val)

    ...
 Local vars
/usr/local/lib/python2.7/dist-packages/djorm_hstore/fields.py in __set__

                value = self.field._attribute_class(value, self.field, obj)

    ...
 Local vars
/usr/local/lib/python2.7/dist-packages/djorm_hstore/fields.py in __init__

            super(HStoreDictionary, self).__init__(value, **params)

    ...
 Local vars

当我尝试访问hstore queryset时,也会发生这种情况:

[编辑]

Traceback (most recent call last):
File "manage.py", line 14, in <module>
    execute_manager(settings)

File "/usr/local/lib/python2.7/dist-packages/django/core/management/__init__.py", line 459, in execute_manager
    utility.execute()

File "/usr/local/lib/python2.7/dist-packages/django/core/management/__init__.py", line 382, in execute
    self.fetch_command(subcommand).run_from_argv(self.argv)

File "/usr/local/lib/python2.7/dist-packages/django/core/management/base.py", line 196, in run_from_argv
    self.execute(*args, **options.__dict__)

File "/usr/local/lib/python2.7/dist-packages/django/core/management/base.py", line 232, in execute
    output = self.handle(*args, **options)

File "/home/name/workspace/project/app/data/commands/my_command.py", line 60, in handle
    item_id = tmp[0].id,

File "/usr/local/lib/python2.7/dist-packages/django/db/models/query.py", line 207, in __getitem__
    return list(qs)[0]

File "/usr/local/lib/python2.7/dist-packages/django/db/models/query.py", line 87, in __len__
    self._result_cache.extend(self._iter)

File "/usr/local/lib/python2.7/dist-packages/django/db/models/query.py", line 301, in iterator
    obj = model(*row[index_start:aggregate_start])

File "/usr/local/lib/python2.7/dist-packages/django/db/models/base.py", line 300, in __init__
    setattr(self, field.attname, val)

File "/usr/local/lib/python2.7/dist-packages/djorm_hstore/fields.py", line 38, in __set__
    value = self.field._attribute_class(value, self.field, obj)

File "/usr/local/lib/python2.7/dist-packages/djorm_hstore/fields.py", line 21, in __init__
    super(HStoreDictionary, self).__init__(value, **params)

ValueError: dictionary update sequence element #0 has length 1; 2 is required

代码是:

tmp = Item.objects.where(HE("kv").contains({'key':value}))

if tmp.count() > 0:

    item_id = tmp[0].id,

我只是在尝试获取价值。我不理解“更新顺序”消息。当我使用游标而不是hstore queryset时,该函数有效。错误也来自模板渲染。我刚刚重新启动uwsgi,一切正常,但是稍后又返回了错误。

[编辑]

有人知道吗?


请发布代码,以显示values和中的内容tmp。缺少代码时,此问题为-1(可能是暂时的)。
ElmoVanKielmo

我将其添加为评论。我收到错误是因为我使用列表而不是元组。这引发了错误:dict(['A',"b"])事实并非如此dict([('A',"b")])
NelsonGon

Answers:


397

刚遇到这个问题。我不知道是不是碰到了您的代码,但是对我而言,根本原因是因为我忘记name=url(或path在Django 2.0+中)函数调用的最后一个参数。

例如,以下函数引发问题中的错误:

url(r'^foo/(?P<bar>[A-Za-z]+)/$', views.FooBar.as_view(), 'foo')
path('foo/{slug:bar}/', views.FooBar, 'foo')

但是这些实际上有效:

url(r'^foo/(?P<bar>[A-Za-z]+)/$', views.FooBar.as_view(), name='foo')
path('foo/{slug:bar}/', views.FooBar, name='foo')

回溯之所以无济于事,是因为Django在内部希望将给定的位置参数解析为关键字 arguments kwargs,并且由于字符串是可迭代的,因此非典型代码路径开始展开。始终name=在您的网址上使用!


40
这个答案非常好,因为它涵盖了难以理解的模糊错误。即使是经验丰富的Django开发人员也可能会陷入这种陷阱。
glarrain

4
特别是如果您还使用Router.registerDjango RestFramework 的方法。看起来非常相似,不同之处在于namekwarg ...
Risadinha

4
好吧,这半个小时花在了无用的生产上,这再也不会回来了。tnx。
Iman Akbari

2
辉煌!正是我所忘记的:S
rschwieb '16

2
仅供参考,我也使用Django 2.0样式pathURL 收到此错误。忘记使用kwarg了,它有:path('foo/', views.foo, 'foo')。我不得不改成path('foo/', views.foo, name='foo')
inostia

38

我在弄乱字符串和字典时遇到了这个错误。

dict1 = {'taras': 'vaskiv', 'iruna': 'vaskiv'}
str1 = str(dict1)
dict(str1)
*** ValueError: dictionary update sequence element #0 has length 1; 2 is required

因此,您实际上要做的是从字符串中获取字典:

dic2 = eval(str1)
dic2
{'taras': 'vaskiv', 'iruna': 'vaskiv'}

或者出于安全考虑,我们可以使用literal_eval

from ast import literal_eval

还有其他方法吗?
亚当·夏姆苏登(Adam Shamsudeen),

28

尝试执行以下操作时,将引发问题错误:

>>> a_dictionary = {}
>>> a_dictionary.update([[1]])
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: dictionary update sequence element #0 has length 1; 2 is required

除非显示完整的追溯代码,否则很难说出代码中的原因。


5
这确认了原因未包含在问题中。
ElmoVanKielmo

下次感谢您的回答,我将复制回溯,但是很奇怪,当它与模板标签一起发生时,在uwsgi重新启动后,结果正确显示,所以得到了结果
user2575627 2013年

2
@ user2575627,为什么不现在发布代码/回溯?更新(编辑)您的问题。
falsetru

抱歉,我没有发布代码/回溯信息,因为它迫切需要修复/修复该服务,因此我没有第一次复制回溯信息
user2575627 2013年

@ user2575627,能否在/home/name/workspace/project/app/data/commands/my_command.py第60行周围发布代码?
falsetru

18

当我忘记将关键字参数名称传递给url()函数时,我遇到了上述问题。

错误代码

 url(r"^testing/$", views.testing, "testing")

代码无错误

url(r"^testing/$", views.testing, name="testing")

所以最后我以这种方式消除了上面的错误。您的情况可能有所不同。因此,请在urls.py中检查您的网址格式。


1
2019和相同的stackoverflow答案仍然每次都为我省钱
Long Nguyen

是的,非常感谢。对于开发人员,科学家和其他人员来说,SO确实是一个很好的平台。
hygull19年

10

解”

将关键字参数名称(其值作为视图名称)传递给例如homehome-view等。url()的功能。

引发错误»

url(r'^home$', 'common.views.view1', 'home'),

正确”

url(r'^home$', 'common.views.view1', name='home'),


9

这是重现的错误。

>>> d = {}
>>> d.update([(1,)])
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: dictionary update sequence element #0 has length 1; 2 is required
>>> 
>>> d
{}
>>> 
>>> d.update([(1, 2)])
>>> d
{1: 2}
>>> 
>>> d.update('hello_some_string')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>  
ValueError: dictionary update sequence element #0 has length 1; 2 is required
>>> 

如果给定序列,并且任何元素长度为1且需要两个,那么我们将得到这种错误。参见上面的代码。第一次给序列赋予元组,其长度为1,那么我们得到了错误并且字典没有更新。第二次我给内部元组添加了两个元素,字典得到了更新。


我使用shortucts.redirect,并试图发送到外部页面的响应得到同样的错误..例如,'[代码]返回重定向(‘ msn.com’)[/代码]
roblem

3

我遇到了同样的问题,发现这是由于参数错误造成的。在中views.py,我使用了:

return render(request, 'demo.html',{'items', items})    

但我发现了问题:{'items', items}。进行更改以{'items': items}解决问题。


2

就我而言,我get_context_data的观点之一是return render(self.request, 'es_connection_error.html', {'error':error});在try / catch块中返回而不是返回context


2

错误应该与参数有关。请验证params是否为字典对象。如果只是参数列表/元组,则仅使用一个*(*params)而不是两个*(**params)。这会将列表/元组爆炸为适当数量的参数。

或者,如果参数来自代码的其他部分作为JSON文件,请这样做json.loads(params),因为JSON对象有时表现为字符串,因此您需要使用来自字符串的负载(负载)将其作为JSON。

super(HStoreDictionary, self).__init__(value, **params)

希望这可以帮助!


1

尝试使用错误类型的参数调用update方法时遇到此问题。预期的结果是:

{'foo': True}

通过的是:

{'foo': "True"}

确保您检查传递的所有参数均为预期类型。


0

您发送的参数不正确;它应该是dictionary object

  • 错误: func(a=r)

  • 正确: func(a={'x':y})


0

我也有类似的问题。解决方法很简单。只是不要尝试在值中输入NULL或None值,否则您可能必须使用类似这样的东西
dic.update([(key,value)])

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.