Pengecualian “Terlalu banyak nilai untuk dibuka”

116

Saya sedang mengerjakan sebuah proyek di Django dan saya baru saja mulai mencoba untuk memperluas model Pengguna untuk membuat profil pengguna.

Sayangnya, saya mengalami masalah: Setiap kali saya mencoba memasukkan profil pengguna ke dalam template ( user.get_template.lastIP, misalnya), saya mendapatkan error berikut:

Lingkungan Hidup:

Metode Permintaan: GET
URL Permintaan: http: // localhost: 8000 /
Versi Django: 1.1.0
Versi Python: 2.6.1.0

Kesalahan template:
Di template /path/to/base.tpl, error di baris 19
   Menangkap pengecualian saat merender: terlalu banyak nilai untuk dibuka kemasannya

19: Halo, {{user.username}} ({{user.get_profile.rep}}). Bagaimana itu berjalan? Keluar


Jenis Pengecualian: TemplateSyntaxError at /
Nilai Pengecualian: Menangkap pengecualian saat rendering: terlalu banyak nilai untuk dibuka kemasannya

Ada gagasan tentang apa yang sedang terjadi atau apa yang saya lakukan salah?

Steve Gattuso
sumber
3
Informasi tidak cukup. Silakan posting model UserProfile Anda.
Daniel Roseman

Jawaban:

190

Pengecualian itu berarti bahwa Anda mencoba untuk mengekstrak tupel, tetapi tupel tersebut memiliki terlalu banyak nilai sehubungan dengan jumlah variabel target. Misalnya: ini bekerja, dan mencetak 1, lalu 2, lalu 3

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

Tapi ini menimbulkan kesalahan Anda

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

kenaikan

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

Sekarang, alasan mengapa ini terjadi dalam kasus Anda, saya tidak tahu, tetapi mungkin jawaban ini akan mengarahkan Anda ke arah yang benar.

Stefano Borini
sumber
1
@Sterfano Borini, saya juga mendapatkan kesalahan yang serupa tetapi dalam kasus saya, saya membuat string seolah obj='{"vendorId": "' + vID +'", "vendorName" :"'+vName+'", "addedDate" : "'+vAddedDate+'","usersList" : "'+ usersList + '," status" : "'+str(vStatus)+'","edit"'+edit+'"}';-olah semua nilainya adalah string, itu memberi saya kesalahan, saya menjalankannya pada prompt python itu sedang berjalan, tetapi saat mengambil respons dari web itu beri saya pengecualian ini. bisakah Anda menyarankan apa yang salah.
MegaBytes
Bagi siapa pun yang masih tidak mengerti (yaitu saya) video ini menjelaskan hal yang persis sama ... dengan kata-kata dan gambar yang entah bagaimana membuat saya mengerti :)
Wesley Smith
Kesalahan tidak selalu berarti a tuplesedang dibuka. Ini bisa berupa tipe urutan apa saja. Ini mungkin memungkinkan jenis iterable; Saya tidak ingat begitu saja.
jpmc26
20

coba bongkar dalam satu variabel,

python akan menanganinya sebagai daftar,

lalu keluarkan dari daftar

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
Ahmad Dwaik
sumber
4
dapatkah seseorang menjelaskan lebih lanjut tentang ini?
dukung
8

Masalah ini tampak familiar jadi saya pikir saya akan melihat apakah saya dapat mereplikasi dari jumlah informasi yang terbatas.

Pencarian cepat menemukan entri di blog James Bennett di sini yang menyebutkan bahwa ketika bekerja dengan ProfilPengguna untuk memperluas model Pengguna kesalahan umum dalam settings.py dapat menyebabkan Django membuang kesalahan ini.

Mengutip entri blog:

Nilai pengaturannya bukanlah "appname.models.modelname", ini hanya "appname.modelname". Alasannya adalah Django tidak menggunakan ini untuk melakukan impor langsung; sebaliknya, ini menggunakan fungsi pemuatan model internal yang hanya menginginkan nama aplikasi dan nama model. Mencoba melakukan hal-hal seperti "appname.models.modelname" atau "projectname.appname.models.modelname" dalam pengaturan AUTH_PROFILE_MODULE akan menyebabkan Django meledak dengan kesalahan "terlalu banyak nilai untuk dibongkar", jadi pastikan Anda letakkan "appname.modelname", dan tidak ada yang lain, dalam nilai AUTH_PROFILE_MODULE.

Jika OP telah menyalin lebih dari traceback saya akan berharap untuk melihat sesuatu seperti di bawah ini yang dapat saya duplikat dengan menambahkan "model" ke pengaturan AUTH_PROFILE_MODULE saya.

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

Ini saya pikir adalah salah satu dari sedikit kasus dimana Django masih memiliki sedikit sihir impor yang cenderung menyebabkan kebingungan ketika kesalahan kecil tidak memunculkan pengecualian yang diharapkan.

Anda dapat melihat di akhir penelusuran kembali yang saya posting bagaimana menggunakan apapun selain bentuk "appname.modelname" untuk AUTH_PROFILE_MODULE akan menyebabkan baris "app_label, model_name = pengaturan.AUTH_PROFILE_MODULE.split ('.')" Untuk melempar Kesalahan "terlalu banyak nilai untuk dibuka".

Saya 99% yakin bahwa ini adalah masalah asli yang dihadapi di sini.

Hylidan
sumber
Apa yang terjadi jika Anda tidak punya AUTH_PROFILE_MODULEdi Anda settings.py?
Sevenearths
0

Kemungkinan besar ada kesalahan di suatu tempat dalam panggilan get_profile (). Dalam pandangan Anda, sebelum Anda mengembalikan objek permintaan, letakkan baris ini:

request.user.get_profile()

Ini akan meningkatkan kesalahan, dan memberi Anda pelacakan balik yang lebih mendetail, yang kemudian dapat Anda gunakan untuk debug lebih lanjut.

pendeta
sumber
0

Ini terjadi pada saya saat saya menggunakan Jinja2 untuk template. Masalahnya bisa diatasi dengan menjalankan server pengembangan menggunakan runserver_plusperintah dari django_extensions .

Ia menggunakan debugger werkzeug yang juga jauh lebih baik dan memiliki konsol debugging interaktif yang sangat bagus. Itu melakukan sihir ajax untuk meluncurkan shell python di bingkai apa pun (dalam tumpukan panggilan) sehingga Anda dapat men-debug.

hasen
sumber