「アンパックする値が多すぎます」例外


116

私はDjangoでプロジェクトに取り組んでおり、ユーザープロファイルを作成するためにユーザーモデルを拡張しようとしています。

残念ながら、私は問題に遭遇しました。user.get_template.lastIPたとえば、テンプレート内にユーザーのプロファイルを取得しようとするたびに(たとえば)、次のエラーが発生します。

環境:

リクエストメソッド:GET
リクエストURL:http:// localhost:8000 /
Djangoバージョン:1.1
Pythonバージョン:2.6.1

テンプレートエラー:
テンプレート/path/to/base.tplの19行目のエラー
   レンダリング中に例外をキャッチ:展開するには値が多すぎます

19:こんにちは、{{user.username}}({{user.get_profile.rep}})。元気?ログアウト


例外タイプ:/のTemplateSyntaxError
例外値:レンダリング中に例外をキャッチ:値が多すぎてアンパックできません

何が起こっているのか、私が間違っているのかについてのアイデアはありますか?


3
十分な情報がありません。UserProfileモデルを投稿してください。
ダニエルローズマン

回答:


189

その例外は、タプルをアンパックしようとしているが、タプルのターゲット変数の数に対して値が多すぎることを意味します。例:この作品では、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+'"}';すべての値が文字列であるにもかかわらず文字列を作成していますこの例外を私に与えます。何がうまくいかないのか教えてください。
MegaBytes

まだ理解できない人(つまり、私)にとって、このビデオはまったく同じことを説明しています...どういうわけか私に理解させた言葉と写真で:)
Wesley Smith

エラーは、必ずしもtupleが解凍されていることを意味するわけではありません。任意のシーケンスタイプを使用できます。反復可能な型を許可する場合があります。すぐに思い出せない。
jpmc26 2018年

20

1つの変数でアンパックしてみてください。

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
誰かがこれについてもっと説明できますか?
ピギーバック2014年

8

この問題はよく知られているように見えたので、限られた量の情報から複製できるかどうかを確認したいと思いました。

クイック検索は、ジェームズ・ベネットのブログにエントリを上げ、ここで Userモデルを拡張するためのUserProfileで作業するときsettings.pyでよくある間違いは、Djangoはこのエラーをスローする可能性がありますことを言及しています。

ブログエントリを引用するには:

設定の値は「appname.models.modelname」ではなく、単に「appname.modelname」です。その理由は、Djangoがこれを直接インポートに使用していないためです。代わりに、アプリの名前とモデルの名前のみを必要とする内部モデル読み込み関数を使用しています。AUTH_PROFILE_MODULE設定で "appname.models.modelname"や "projectname.appname.models.modelname"のようなことを行おうとすると、Djangoは恐ろしい "too many values to unpack"エラーで爆破するので、確認してくださいAUTH_PROFILE_MODULEの値に「appname.modelname」のみを入れます。

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にインポートマジックがまだいくつかあり、小さなエラーが予期した例外をスローしないときに混乱を招く数少ないケースの1つだと思います。

トレースバックの最後で、AUTH_PROFILE_MODULEに「appname.modelname」以外の形式を使用すると、「app_label、model_name = settings.AUTH_PROFILE_MODULE.split( '。')」という行が原因でスローされることがわかります。 「アンパックするには値が多すぎます」エラー。

これはここで発生した元の問題であったと99%確信しています。


入っていない場合はどうなりAUTH_PROFILE_MODULEますsettings.pyか?
セブンアース

0

おそらくget_profile()呼び出しのどこかにエラーがあります。ビューで、リクエストオブジェクトを返す前に、次の行を追加します。

request.user.get_profile()

エラーが発生し、さらに詳細なトレースバックが得られます。これを使用して、さらにデバッグすることができます。


0

これは、テンプレートにJinja2を使用しているときに発生します。この問題はrunserver_plusdjango_extensionsのコマンドを使用して開発サーバーを実行することで解決できます

これはwerkzeugデバッガーを使用しますが、これもたまたま優れており、非常に優れたインタラクティブなデバッグコンソールを備えています。デバッグできるように、(コールスタック内の)任意のフレームでpythonシェルを起動するために、いくつかのajaxマジックを実行します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.