“Quá nhiều giá trị để giải nén” Ngoại lệ


116

Tôi đang thực hiện một dự án ở Django và tôi vừa bắt đầu cố gắng mở rộng mô hình Người dùng để tạo hồ sơ người dùng.

Thật không may, tôi đã gặp phải một sự cố: Mỗi lần tôi cố gắng đưa hồ sơ của người dùng vào bên trong một mẫu ( user.get_template.lastIPví dụ:), tôi gặp lỗi sau:

Môi trường:

Phương thức yêu cầu: GET
URL yêu cầu: http: // localhost: 8000 /
Phiên bản Django: 1.1
Phiên bản Python: 2.6.1

Lỗi mẫu:
Trong mẫu /path/to/base.tpl, lỗi ở dòng 19
   Bắt một ngoại lệ khi hiển thị: quá nhiều giá trị để giải nén

19: Xin chào, {{user.username}} ({{user.get_profile.rep}}). Khỏe không? Đăng xuất


Loại ngoại lệ: TemplateSyntaxError at /
Giá trị ngoại lệ: Bắt một ngoại lệ trong khi hiển thị: quá nhiều giá trị để giải nén

Bất kỳ ý tưởng nào về những gì đang xảy ra hoặc những gì tôi đang làm sai?


3
Không đủ thông tin. Vui lòng đăng mô hình UserProfile của bạn.
Daniel Roseman 25/09/09

Câu trả lời:


189

Ngoại lệ đó có nghĩa là bạn đang cố gắng giải nén một tuple, nhưng tuple có quá nhiều giá trị liên quan đến số lượng biến đích. Ví dụ: tác phẩm này và in 1, rồi 2, rồi 3

def returnATupleWithThreeValues():
    return (1,2,3)
a,b,c = returnATupleWithThreeValues()
print a
print b
print c

Nhưng điều này làm tăng lỗi của bạn

def returnATupleWithThreeValues():
    return (1,2,3)
a,b = returnATupleWithThreeValues()
print a
print b

tăng

Traceback (most recent call last):
  File "c.py", line 3, in ?
    a,b = returnATupleWithThreeValues()
ValueError: too many values to unpack

Bây giờ, lý do tại sao điều này xảy ra trong trường hợp của bạn, tôi không biết, nhưng có lẽ câu trả lời này sẽ chỉ cho bạn đúng hướng.


1
@Sterfano Borini, tôi cũng gặp lỗi tương tự nhưng trong trường hợp của tôi, tôi đang tạo một chuỗi obj='{"vendorId": "' + vID +'", "vendorName" :"'+vName+'", "addedDate" : "'+vAddedDate+'","usersList" : "'+ usersList + '," status" : "'+str(vStatus)+'","edit"'+edit+'"}';mặc dù tất cả các giá trị đều là chuỗi, nó báo cho tôi lỗi, tôi chạy nó trên lời nhắc python thì nó đang chạy, nhưng trong khi nhận phản hồi từ web thì nó cho tôi ngoại lệ này. bạn có thể vui lòng đề xuất có chuyện gì không.
MegaBytes

Đối với bất cứ ai mà vẫn didnt có được nó (tức là tôi) video này giải thích chính xác những điều tương tự ... với các từ và hình ảnh mà bằng cách nào đó làm cho tôi hiểu :)
Wesley Smith

Lỗi không nhất thiết có nghĩa là a tupleđang được giải nén. Nó có thể là bất kỳ loại trình tự nào. Nó có thể cho phép bất kỳ kiểu lặp lại nào; Tôi không thể nhớ lại tay.
jpmc26

20

hãy thử giải nén trong một biến,

python sẽ xử lý nó như một danh sách,

sau đó giải nén khỏi danh sách

def returnATupleWithThreeValues():
    return (1,2,3)
a = returnATupleWithThreeValues() # a is a list (1,2,3)
print a[0] # list[0] = 1
print a[1] # list[1] = 2
print a[2] # list[2] = 3

4
ai đó có thể giải thích thêm về điều này?
cõng

8

Vấn đề này trông quen thuộc nên tôi nghĩ tôi sẽ xem liệu tôi có thể tái tạo từ lượng thông tin hạn chế hay không.

Một tìm kiếm nhanh đã đưa ra một mục trong blog của James Bennett ở đây đề cập rằng khi làm việc với UserProfile để mở rộng mô hình Người dùng, một lỗi phổ biến trong settings.py có thể khiến Django gặp lỗi này.

Để trích dẫn mục nhập blog:

Giá trị của cài đặt không phải là "appname.models.modelname", mà chỉ là "appname.modelname". Lý do là Django không sử dụng điều này để nhập khẩu trực tiếp; thay vào đó, nó sử dụng chức năng tải mô hình nội bộ chỉ muốn tên của ứng dụng và tên của mô hình. Cố gắng thực hiện những việc như "appname.models.modelname" hoặc "projectname.appname.models.modelname" trong cài đặt AUTH_PROFILE_MODULE sẽ khiến Django phát nổ với lỗi "quá nhiều giá trị để giải nén", vì vậy hãy đảm bảo rằng bạn đặt "appname.modelname" và không đặt gì khác vào giá trị của AUTH_PROFILE_MODULE.

Nếu OP đã sao chép thêm bản theo dõi, tôi sẽ thấy thứ gì đó giống như bản bên dưới mà tôi có thể sao chép bằng cách thêm "mô hình" vào cài đặt AUTH_PROFILE_MODULE của mình.

TemplateSyntaxError at /

Caught an exception while rendering: too many values to unpack

Original Traceback (most recent call last):
  File "/home/brandon/Development/DJANGO_VERSIONS/Django-1.0/django/template/debug.py", line 71, in render_node
    result = node.render(context)
  File "/home/brandon/Development/DJANGO_VERSIONS/Django-1.0/django/template/debug.py", line 87, in render
    output = force_unicode(self.filter_expression.resolve(context))
  File "/home/brandon/Development/DJANGO_VERSIONS/Django-1.0/django/template/__init__.py", line 535, in resolve
    obj = self.var.resolve(context)
  File "/home/brandon/Development/DJANGO_VERSIONS/Django-1.0/django/template/__init__.py", line 676, in resolve
    value = self._resolve_lookup(context)
  File "/home/brandon/Development/DJANGO_VERSIONS/Django-1.0/django/template/__init__.py", line 711, in _resolve_lookup
    current = current()
  File "/home/brandon/Development/DJANGO_VERSIONS/Django-1.0/django/contrib/auth/models.py", line 291, in get_profile
    app_label, model_name = settings.AUTH_PROFILE_MODULE.split('.')
ValueError: too many values to unpack

Tôi nghĩ đây là một trong số ít trường hợp Django vẫn có một chút phép thuật nhập khẩu có xu hướng gây nhầm lẫn khi một lỗi nhỏ không ném ra ngoại lệ mong đợi.

Bạn có thể thấy ở cuối phần theo dõi mà tôi đã đăng cách sử dụng bất kỳ thứ gì khác ngoài biểu mẫu "appname.modelname" cho AUTH_PROFILE_MODULE sẽ khiến dòng "app_label, model_name = settings.AUTH_PROFILE_MODULE.split ('.')" Để ném lỗi "quá nhiều giá trị để giải nén".

Tôi chắc chắn 99% rằng đây là vấn đề ban đầu gặp phải ở đây.


Điều gì xảy ra nếu bạn không có AUTH_PROFILE_MODULEtrong của bạn settings.py?
Sevenearths

0

Rất có thể có lỗi ở đâu đó trong cuộc gọi get_profile (). Theo quan điểm của bạn, trước khi bạn trả lại đối tượng yêu cầu, hãy đặt dòng này:

request.user.get_profile()

Nó sẽ nâng cao lỗi và cung cấp cho bạn bản ghi lại chi tiết hơn, sau đó bạn có thể sử dụng để gỡ lỗi thêm.


0

Điều này xảy ra với tôi khi tôi sử dụng Jinja2 cho các mẫu. Vấn đề có thể được giải quyết bằng cách chạy máy chủ phát triển bằng runserver_pluslệnh từ django_extensions .

Nó sử dụng trình gỡ lỗi werkzeug , điều này cũng tốt hơn rất nhiều và có bảng điều khiển gỡ lỗi tương tác rất đẹp. Nó thực hiện một số phép thuật ajax để khởi chạy một trình bao python ở bất kỳ khung nào (trong ngăn xếp cuộc gọi) để bạn có thể gỡ lỗi.

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.