“解包值过多”异常

140 投票
6 回答
460828 浏览
提问于 2025-04-15 14:36

我正在做一个Django项目,最近开始尝试扩展用户模型,以便制作用户资料。

不过,我遇到了一个问题:每次我在模板中尝试获取用户的资料(比如user.get_template.lastIP)时,都会出现以下错误:

Environment:

Request Method: GET
Request URL: http://localhost:8000/
Django Version: 1.1
Python Version: 2.6.1

Template error:
In template /path/to/base.tpl, error at line 19
   Caught an exception while rendering: too many values to unpack

19 :                Hello, {{user.username}} ({{ user.get_profile.rep}}). How's it goin? Logout


Exception Type: TemplateSyntaxError at /
Exception Value: Caught an exception while rendering: too many values to unpack

有没有人知道这是怎么回事,或者我哪里做错了?

6 个回答

8

这个问题听起来很眼熟,所以我想看看能不能根据有限的信息复现一下。

我快速搜索了一下,发现了James Bennett的博客里有一篇文章在这里,提到在使用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”,别的都不要。

如果提问者能复制更多的错误追踪信息,我预计会看到类似下面的内容,这是我通过在AUTH_PROFILE_MODULE设置中添加“models”复现出来的。

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('.')”抛出“too many values to unpack”的错误。

我99%确定这就是这里遇到的原始问题。

22

试着把内容放在一个变量里,

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
210

这个错误的意思是你在尝试拆解一个元组,但这个元组里的值比你想要的变量多。举个例子:下面这段代码可以正常运行,并依次打印出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

至于为什么在你的情况下会发生这种情况,我不太清楚,但也许这个回答能给你一些启发。

撰写回答