"Paketten çıkarmak için çok fazla değer" İstisna


116

Django'da bir proje üzerinde çalışıyorum ve kullanıcı profilleri oluşturmak için Kullanıcı modelini genişletmeye yeni başladım.

Ne yazık ki bir sorunla karşılaşıyorum: Kullanıcının profilini bir şablonun içine her girdiğimde ( user.get_template.lastIPörneğin), aşağıdaki hatayı alıyorum:

Çevre:

İstek Yöntemi: GET
İstek URL'si: http: // localhost: 8000 /
Django Sürümü: 1.1
Python Sürümü: 2.6.1

Şablon hatası:
/Path/to/base.tpl şablonunda, 19. satırda hata
   Oluşturma sırasında bir istisna yakalandı: paketten çıkarılamayacak kadar çok değer

19: Merhaba, {{user.username}} ({{user.get_profile.rep}}). Nasıl gidiyor? Çıkış Yap


İstisna Türü: / konumunda TemplateSyntaxError
İstisna Değeri: Oluşturma sırasında bir istisna yakalandı: paketten çıkarılamayacak kadar çok değer

Neler olduğu veya neyi yanlış yaptığıma dair bir fikriniz var mı?


3
Yeterli bilgi yok. Lütfen UserProfile modelinizi gönderin.
Daniel Roseman

Yanıtlar:


190

Bu istisna, bir demeti açmaya çalıştığınız anlamına gelir, ancak demet, hedef değişkenlerin sayısına göre çok fazla değere sahiptir. Örneğin: bu çalışır ve 1, ardından 2, sonra 3 yazdırır

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

Ama bu senin hatanı artırıyor

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

yükseltmeler

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

Şimdi, bunun sizin durumunuzda olmasının nedeni, bilmiyorum, ama belki bu cevap sizi doğru yönü gösterecektir.


1
@Sterfano Borini, ben de benzer bir hata alıyorum ama benim durumumda obj='{"vendorId": "' + vID +'", "vendorName" :"'+vName+'", "addedDate" : "'+vAddedDate+'","usersList" : "'+ usersList + '," status" : "'+str(vStatus)+'","edit"'+edit+'"}';tüm değerler string olmasına rağmen bana hata veriyor, python komut isteminde çalıştırıyorum, ancak web'den yanıt alırken çalıştırıyorum bana bu istisnayı veriyor. lütfen neyin yanlış gittiğini önerebilir misin?
MegaBytes

Hala anlamayanlar için (yani ben) bu video aynı şeyi açıklıyor ... bir şekilde anlamamı sağlayan kelimeler ve resimlerle :)
Wesley Smith

Hata, mutlaka a tuplepaketinin açıldığı anlamına gelmez . Herhangi bir dizi türü olabilir. Yinelenebilir herhangi bir türe izin verebilir; Elimi hatırlayamıyorum.
jpmc26

20

tek bir değişkeni açmayı deneyin,

python bunu bir liste olarak işleyecektir,

sonra listeden çıkartın

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
Birisi bu konuda daha fazlasını açıklayabilir mi?
bindirme

8

Bu sorun tanıdık geldi, bu yüzden sınırlı miktardaki bilgiden kopyalayıp kopyalayamayacağımı görmeyi düşündüm.

Bir hızlı arama James Bennett blogunda bir girişi geldi buraya Kullanıcı modelini genişletmek için Kullanıcıprofili ile çalışırken settings.py içinde yaygın bir hatadır Django bu hataya atmak neden olabilir bahseder hangi.

Blog girişinden alıntı yapmak için:

Ayarın değeri "appname.models.modelname" değil, yalnızca "appname.modelname". Nedeni, Django'nun bunu doğrudan içe aktarma yapmak için kullanmamasıdır; bunun yerine, yalnızca uygulamanın adını ve modelin adını isteyen dahili bir model yükleme işlevi kullanıyor. AUTH_PROFILE_MODULE ayarında "appname.models.modelname" veya "projectname.appname.models.modelname" gibi şeyler yapmaya çalışmak Django'nun korkunç "paketten çıkarılamayacak kadar çok değer" hatasıyla patlamasına neden olur, bu yüzden emin olun AUTH_PROFILE_MODULE değerine "appname.modelname" koyun ve başka hiçbir şey koymayın.

OP, traceback'in daha fazlasını kopyalamış olsaydı, AUTH_PROFILE_MODULE ayarıma "modeller" ekleyerek kopyalayabildiğim aşağıdaki gibi bir şey görmeyi beklerdim.

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

Sanırım bu, Django'nun hala küçük bir hata beklenen istisnayı atmadığında kafa karışıklığına neden olan biraz içe aktarma büyüsüne sahip olduğu birkaç durumdan biri.

AUTH_PROFILE_MODULE için "appname.modelname" formundan başka herhangi bir şeyin kullanılmasının, "app_label, model_name = settings.AUTH_PROFILE_MODULE.split ('.')" Satırının "paketten çıkarılamayacak kadar çok değer" hatası.

Bunun burada karşılaşılan orijinal sorun olduğundan% 99 eminim.


Sende olmayan ne olur AUTH_PROFILE_MODULEGözlerinde farklı settings.py?
Sevenearths

0

Büyük olasılıkla get_profile () çağrısının bir yerinde bir hata vardır. Sizin görüşünüze göre, istek nesnesini iade etmeden önce şu satırı koyun:

request.user.get_profile()

Hatayı yükseltmeli ve daha sonra daha fazla hata ayıklamak için kullanabileceğiniz daha ayrıntılı bir izleme vermelidir.


0

Şablonlar için Jinja2'yi kullandığımda bu bana oluyor. Django_extensionsrunserver_plus komutunu kullanarak geliştirme sunucusunu çalıştırarak sorun çözülebilir .

Aynı zamanda çok daha iyi olan ve çok güzel bir etkileşimli hata ayıklama konsoluna sahip olan werkzeug hata ayıklayıcısını kullanır . Herhangi bir çerçevede (çağrı yığınında) bir python kabuğu başlatmak için biraz ajax büyüsü yapar , böylece hata ayıklayabilirsiniz.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.