“解压缩的值过多”异常

时间:2009-09-25 22:04:27

标签: python django

我正在Django开展一个项目,我刚开始尝试扩展User模型以制作用户配置文件。

不幸的是,我遇到了一个问题:每次我尝试在模板(例如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 个答案:

答案 0 :(得分:167)

该异常意味着您正在尝试解包元组,但元组的目标变量数量太多。例如:这项工作,并打印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 :(得分:16)

尝试在一个变量中解压缩,

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

答案 2 :(得分:8)

这个问题看起来很熟悉所以我想我是否可以从有限的信息中复制出来。

快速搜索在James Bennett的博客here中找到了一个条目,其中提到当使用UserProfile扩展User模型时,settings.py中的常见错误会导致Django抛出此错误。

引用博客文章:

  

设置的值不是“appname.models.modelname”,它只是“appname.modelname”。原因是Django没有使用它来直接导入;相反,它使用内部模型加载功能,只需要应用程序的名称和模型的名称。尝试在AUTH_PROFILE_MODULE设置中执行“appname.models.modelname”或“projectname.appname.models.modelname”之类的操作会导致Django被可怕的“太多值解压缩”错误炸毁,所以请确保你已经在“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仍有一些导入魔法的少数情况之一,当一个小错误没有引发预期的异常时,它会导致混淆。

你可以在回溯的最后看到我发布了如何使用AUTH_PROFILE_MODULE的“appname.modelname”形式之外的任何内容将导致行“app_label,model_name = settings.AUTH_PROFILE_MODULE.split('。')”抛出“太多值来解包”错误。

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

答案 3 :(得分:0)

很可能在get_profile()调用的某处出现错误。在您的视图中,在返回请求对象之前,请输入以下行:

request.user.get_profile()

它应该引发错误,并为您提供更详细的回溯,然后您可以使用它进一步调试。

答案 4 :(得分:0)

当我使用Jinja2作为模板时,这种情况发生在我身上。使用runserver_plus中的django_extensions命令运行开发服务器可以解决该问题。

它使用werkzeug调试器,它也恰好好多了,并且有一个非常好的交互式调试控制台。它在任何帧(在调用堆栈中)启动python shell时会做一些ajax魔术,因此你可以进行调试。

答案 5 :(得分:0)

忘记enumerate以尝试access index in a loop

抛出 ValueError: too many values to unpack (expected 2)

for index, value in your_list:
  assert value is your_list[index]  # this line not reached

无异常抛出:

for index, value enumerate(in your_list):
  assert value is your_list[index]