ข้อยกเว้น "มีค่ามากเกินไปที่จะแกะ"


116

ฉันกำลังทำโปรเจ็กต์ใน Django และฉันเพิ่งเริ่มพยายามขยายโมเดลผู้ใช้เพื่อสร้างโปรไฟล์ผู้ใช้

ขออภัยฉันประสบปัญหา: ทุกครั้งที่ฉันพยายามรับโปรไฟล์ของผู้ใช้ภายในเทมเพลต ( user.get_template.lastIPเช่น) ฉันได้รับข้อผิดพลาดต่อไปนี้:

สิ่งแวดล้อม:

วิธีการขอ: รับ
ขอ URL: http: // localhost: 8000 /
Django เวอร์ชัน: 1.1.2
เวอร์ชัน Python: 2.6.1.1

ข้อผิดพลาดของเทมเพลต:
ในเทมเพลต /path/to/base.tpl มีข้อผิดพลาดที่บรรทัด 19
   พบข้อยกเว้นขณะแสดงผล: มีค่ามากเกินไปที่จะแกะออก

19: สวัสดี {{user.username}} ({{user.get_profile.rep}}) มันเป็นอย่างไรบ้าง? ออกจากระบบ


ประเภทข้อยกเว้น: TemplateSyntaxError ที่ /
ค่าข้อยกเว้น: พบข้อยกเว้นขณะแสดงผล: มีค่ามากเกินไปที่จะแกะออก

มีความคิดเกี่ยวกับสิ่งที่เกิดขึ้นหรือสิ่งที่ฉันทำผิดหรือไม่?


3
ข้อมูลไม่เพียงพอ กรุณาโพสต์รูปแบบ UserProfile ของคุณ
Daniel Roseman

คำตอบ:


190

ข้อยกเว้นนั้นหมายความว่าคุณกำลังพยายามแกะทูเปิล แต่ทูเพิลมีค่ามากเกินไปเมื่อเทียบกับจำนวนตัวแปรเป้าหมาย ตัวอย่างเช่น: งานนี้และพิมพ์ 1 แล้ว 2 จากนั้น 3

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

แต่สิ่งนี้ทำให้เกิดข้อผิดพลาดของคุณ

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

ยก

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

ตอนนี้สาเหตุที่สิ่งนี้เกิดขึ้นในกรณีของคุณฉันไม่รู้ แต่บางทีคำตอบนี้อาจชี้ให้คุณไปในทิศทางที่ถูกต้อง


1
@Sterfano Borini ฉันได้รับข้อผิดพลาดที่คล้ายกัน แต่ในกรณีของฉันฉันกำลังสร้างสตริงobj='{"vendorId": "' + vID +'", "vendorName" :"'+vName+'", "addedDate" : "'+vAddedDate+'","usersList" : "'+ usersList + '," status" : "'+str(vStatus)+'","edit"'+edit+'"}';แม้ว่าค่าทั้งหมดจะเป็นสตริง แต่ก็ทำให้ฉันมีข้อผิดพลาดฉันเรียกใช้บนพรอมต์ python ที่กำลังทำงานอยู่ แต่ในขณะที่รับการตอบสนองจากเว็บ ให้ข้อยกเว้นนี้แก่ฉัน คุณช่วยแนะนำสิ่งที่ผิดพลาดได้ไหม
MegaBytes

สำหรับใครก็ตามที่ยังไม่เข้าใจ (เช่นฉัน) วิดีโอนี้อธิบายสิ่งเดียวกันทุกประการ ... ด้วยคำพูดและภาพที่ทำให้ฉันเข้าใจ :)
Wesley Smith

ข้อผิดพลาดไม่ได้หมายความว่าtupleกำลังแกะกล่อง สามารถเป็นประเภทลำดับใดก็ได้ อาจอนุญาตให้ทำซ้ำได้ทุกประเภท ฉันจำมือนอกไม่ได้
jpmc26

20

ลองแกะในตัวแปรเดียว

python จะจัดการมันเป็นรายการ

จากนั้นแกะออกจากรายการ

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
ใครช่วยอธิบายเพิ่มเติมเกี่ยวกับเรื่องนี้ได้ไหม
piggyback

8

ปัญหานี้ดูคุ้นเคยดังนั้นฉันจึงคิดว่าฉันจะดูว่าสามารถจำลองข้อมูลจากข้อมูลที่ จำกัด ได้หรือไม่

การค้นหาอย่างรวดเร็วแสดงรายการในบล็อกของ James Bennett ที่นี่ซึ่งกล่าวถึงว่าเมื่อทำงานกับ UserProfile เพื่อขยายโมเดลผู้ใช้ข้อผิดพลาดทั่วไปใน settings.py อาจทำให้ Django โยนข้อผิดพลาดนี้

หากต้องการอ้างอิงรายการบล็อก:

ค่าของการตั้งค่าไม่ใช่ "appname.models.modelname" แต่เป็นเพียง "appname.modelname" เหตุผลก็คือ Django ไม่ได้ใช้สิ่งนี้ในการนำเข้าโดยตรง แทนที่จะใช้ฟังก์ชันโหลดโมเดลภายในซึ่งต้องการเพียงชื่อแอพและชื่อของโมเดล การพยายามทำสิ่งต่างๆเช่น "appname.models.modelname" หรือ "projectname.appname.models.modelname" ในการตั้งค่า AUTH_PROFILE_MODULE จะทำให้ Django ระเบิดขึ้นพร้อมกับข้อผิดพลาด "ค่ามากเกินไปที่จะคลายแพ็ก" ดังนั้นโปรดตรวจสอบว่าคุณ ใส่ "appname.modelname" และไม่มีอะไรอื่นในค่า AUTH_PROFILE_MODULE

หาก OP ได้คัดลอกการย้อนกลับมากขึ้นฉันคาดว่าจะเห็นบางอย่างเช่นด้านล่างซึ่งฉันสามารถทำซ้ำได้โดยการเพิ่ม "โมเดล" ในการตั้งค่า AUTH_PROFILE_MODULE ของฉัน

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

สิ่งนี้ฉันคิดว่าเป็นหนึ่งในไม่กี่กรณีที่ Django ยังคงมีเวทมนตร์นำเข้าอยู่เล็กน้อยซึ่งมีแนวโน้มที่จะทำให้เกิดความสับสนเมื่อข้อผิดพลาดเล็กน้อยไม่ได้ทำให้เกิดข้อยกเว้นที่คาดไว้

คุณสามารถดูได้ในตอนท้ายของการย้อนกลับที่ฉันโพสต์วิธีการใช้สิ่งอื่นนอกเหนือจากรูปแบบ "appname.modelname" สำหรับ AUTH_PROFILE_MODULE จะทำให้บรรทัด "app_label, model_name = settings.AUTH_PROFILE_MODULE.split ('.')" เพื่อโยน ข้อผิดพลาด "มีค่ามากเกินไปที่จะคลายแพ็ก"

ฉันแน่ใจ 99% ว่านี่เป็นปัญหาดั้งเดิมที่พบที่นี่


จะเกิดอะไรขึ้นถ้าคุณยังไม่ได้AUTH_PROFILE_MODULEเข้าร่วมsettings.py?
Sevenearths

0

เป็นไปได้มากว่ามีข้อผิดพลาดเกิดขึ้นในการเรียก get_profile () ในมุมมองของคุณก่อนที่คุณจะส่งคืนวัตถุคำขอให้ใส่บรรทัดนี้:

request.user.get_profile()

ควรเพิ่มข้อผิดพลาดและให้ข้อมูลย้อนกลับโดยละเอียดมากขึ้นซึ่งคุณสามารถใช้เพื่อแก้ไขข้อบกพร่องเพิ่มเติมได้


0

สิ่งนี้เกิดขึ้นกับฉันเมื่อฉันใช้ Jinja2 สำหรับเทมเพลต ปัญหาที่เกิดขึ้นสามารถแก้ไขได้โดยใช้เซิร์ฟเวอร์การพัฒนาโดยใช้runserver_plusคำสั่งจากdjango_extensions

ใช้ดีบักเกอร์werkzeugซึ่งดีกว่ามากและมีคอนโซลการดีบักแบบโต้ตอบที่ดีมาก มันใช้เวทมนตร์ ajax เพื่อเปิด python shell ที่เฟรมใดก็ได้ (ใน call stack) เพื่อให้คุณสามารถแก้จุดบกพร่องได้

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.