Lỗi: Phần tử trình tự cập nhật từ điển # 0 có độ dài 1; 2 là bắt buộc trên Django 1.4


157

Tôi có một thông báo lỗi trên django 1.4:

phần tử trình tự cập nhật từ điển # 0 có độ dài 1; 2 là bắt buộc

[BIÊN TẬP]

Nó đã xảy ra khi tôi thử sử dụng thẻ mẫu như: `{% cho v trong các giá trị%}:

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

Nó cũng xảy ra khi tôi cố gắng truy cập vào bộ truy vấn hstore:

[biên tập]

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

mã là:

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

if tmp.count() > 0:

    item_id = tmp[0].id,

Tôi chỉ đang cố gắng truy cập giá trị. Tôi không hiểu thông báo "trình tự cập nhật". Khi tôi sử dụng một con trỏ thay vì truy vấn hstore, hàm sẽ hoạt động. Lỗi cũng xuất hiện trên mẫu kết xuất. Tôi mới khởi động lại uwsgivà mọi thứ hoạt động tốt, nhưng lỗi lại quay lại sau.

[biên tập]

Có ai có ý kiến ​​gì không?


Vui lòng gửi mã cho thấy những gì trong valuestmp. Trong khi mã bị thiếu, -1 (có thể là tạm thời) cho câu hỏi này.
ElmoVanKielmo

Tôi sẽ thêm nó như một bình luận. Tôi đã nhận được lỗi vì tôi đã sử dụng một danh sách thay vì tuple. Điều này gây ra lỗi: dict(['A',"b"])trong khi điều này không xảy radict([('A',"b")])
NelsonGon

Câu trả lời:


397

Chỉ cần gặp vấn đề này. Tôi không biết liệu đó có phải là điều tương tự xảy ra với mã của bạn không, nhưng đối với tôi nguyên nhân sâu xa là do tôi quên đưa ra name=đối số cuối cùng của lệnh gọi hàm url(hoặc pathtrong Django 2.0+).

Chẳng hạn, các hàm sau ném lỗi từ câu hỏi:

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

Nhưng những điều này thực sự hoạt động:

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

Lý do tại sao traceback là vô ích là bởi vì trong nội bộ, Django muốn phân tích cho vị trí lập luận như từ khóa luận kwargs, và từ một chuỗi là một iterable, một con đường mã không điển hình bắt đầu mở ra. Luôn luôn sử dụng name=trên url của bạn!


40
Câu trả lời này là rất tốt vì nó bao gồm một lỗi tối nghĩa rất khó để tìm ra. Ngay cả các nhà phát triển Django dày dạn cũng có thể rơi vào cái bẫy đặc biệt này.
glarrain

4
Đặc biệt nếu bạn cũng sử dụng Router.registerphương pháp Django RestFramework. Nó trông rất giống nhau, sự khác biệt là namekwarg ...
Risadinha

4
Vâng, đó là nửa giờ dành không hiệu quả mà sẽ không bao giờ trở lại. tnx.
Iman Akbari

2
Xuất sắc! Chính xác những gì tôi đã quên: S
rschwieb

2
FYI Tôi cũng đã nhận được lỗi này khi sử dụng pathURL kiểu Django 2.0 . Quên sử dụng kwarg và có điều này : path('foo/', views.foo, 'foo'). Tôi đã phải đổi thànhpath('foo/', views.foo, name='foo')
inostia

38

Tôi đã gặp lỗi này khi tôi đang loay hoay với chuỗi và từ điển.

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

Vì vậy, những gì bạn thực sự phải làm để có được dict từ chuỗi là:

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

Hoặc trong vấn đề bảo mật, chúng ta có thể sử dụng lítal_eval

from ast import literal_eval

Có cách nào khác để thực hiện điều này không?
adam shamsudeen

28

Lỗi trong câu hỏi của bạn được nêu ra khi bạn thử một cái gì đó như sau:

>>> 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

Thật khó để biết đâu là nguyên nhân trong mã của bạn trừ khi bạn hiển thị mã của mình, truy nguyên đầy đủ.


5
Điều này xác nhận rằng nguyên nhân không được bao gồm trong câu hỏi.
ElmoVanKielmo

Cảm ơn câu trả lời lần sau tôi sẽ sao chép dấu vết, nhưng thật lạ, khi nó xảy ra với thẻ mẫu, ngay sau khi uwsgi khởi động lại, kết quả được hiển thị chính xác, vì vậy đã có kết quả
user2575627

2
@ user2575627, Tại sao bạn không đăng mã / truy nguyên ngay bây giờ? Cập nhật (chỉnh sửa) câu hỏi của bạn.
falsetru

Xin lỗi, tôi đã không đăng mã / truy nguyên vì việc sửa chữa / sửa chữa dịch vụ là khẩn cấp, vì vậy tôi đã không sao chép lần truy xuất này lần đầu tiên
user2575627

@ user2575627, Bạn có thể đăng mã xung quanh /home/name/workspace/project/app/data/commands/my_command.py dòng 60 không?
falsetru

18

Tôi đã đối mặt với vấn đề được đề cập ở trên khi tôi quên chuyển tên đối số từ khóa sang hàm url ().

Mã có lỗi

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

Mã không có lỗi

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

Vì vậy, cuối cùng tôi đã loại bỏ các lỗi trên theo cách này. Nó có thể là một cái gì đó khác nhau trong trường hợp của bạn. Vì vậy, kiểm tra mẫu url của bạn trong urls.py .


1
Năm 2019 và câu trả lời stackoverflow tương tự vẫn giúp tôi tiết kiệm mọi lúc
Long Nguyễn

Vâng, cảm ơn bạn nhiều. SO thực sự là một nền tảng tuyệt vời cho các nhà phát triển, nhà khoa học và những người khác.
hygull

10

Giải pháp"

Truyền tên đối số từ khóa có giá trị làm tên xem của bạn home, home-viewv.v. để url()hoạt động.

Lỗi ném »

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

Chính xác"

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


9

Đây là lỗi sao chép.

>>> 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
>>> 

Nếu bạn đưa ra chuỗi và bất kỳ độ dài phần tử nào là 1 và yêu cầu hai thì chúng ta sẽ gặp loại lỗi này. Xem mã trên. Lần đầu tiên tôi đưa ra chuỗi với tuple và nó dài 1, sau đó chúng tôi đã gặp lỗi và từ điển không được cập nhật. Lần thứ hai tôi đã đưa vào bên trong tuple với hai yếu tố, từ điển đã được cập nhật.


Tôi đang gặp lỗi tương tự khi sử dụng shortucts.redirect và đang cố gắng gửi phản hồi đến một trang bên ngoài .. ví dụ '[code] return redirect (" msn.com") [/ code]
roblem

3

Tôi gặp vấn đề tương tự và thấy rằng đó là do tham số sai. Trong views.py, tôi đã sử dụng:

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

Nhưng tôi tìm thấy vấn đề : {'items', items}. Thay đổi để {'items': items}giải quyết vấn đề.


2

Trong trường hợp của tôi, get_context_datamột trong những quan điểm của tôi đã trở lại return render(self.request, 'es_connection_error.html', {'error':error});trong một khối thử / bắt thay vì quay lạicontext


2

Các lỗi nên được với các thông số. Vui lòng xác minh rằng các thông số là một đối tượng từ điển . Nếu nó chỉ là một danh sách / bộ đối số thì chỉ sử dụng một * ( *params) thay vì hai * ( **params). Điều này sẽ làm nổ danh sách / tuple vào số lượng đối số thích hợp.

Hoặc, nếu các tham số đến từ một phần khác của mã dưới dạng tệp JSON, vui lòng thực hiện json.loads(params), bởi vì các đối tượng JSON đôi khi hoạt động như một chuỗi và do đó bạn cần tạo nó dưới dạng JSON bằng cách sử dụng tải từ chuỗi (tải).

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

Hi vọng điêu nay co ich!


1

Tôi gặp phải vấn đề này khi cố gắng gọi phương thức cập nhật với tham số sai loại. Dict dự kiến ​​là:

{'foo': True}

Một trong những đã được thông qua là:

{'foo': "True"}

đảm bảo bạn kiểm tra tất cả các tham số bạn vượt qua thuộc loại dự kiến.


0

Bạn đang gửi một tham số không chính xác; nó phải là một dictionary object:

  • Sai lầm: func(a=r)

  • Chính xác: func(a={'x':y})


0

Tôi cũng có một loại vấn đề tương tự. Giải pháp rất đơn giản. chỉ không cố gắng nhập giá trị NULL hoặc Không có giá trị trong các giá trị hoặc bạn có thể phải sử dụng cái gì đó như thế này
dic.update([(key,value)])

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.