“解压缩太多值”exception

我正在Django的一个项目,我刚开始尝试扩展用户模型,以使用户configuration文件。

不幸的是,我遇到了一个问题:每当我尝试获取模板内的用户configuration文件(例如user.get_template.lastIP ),我得到以下错误:

环境:

请求方法:GET
请求URL:http:// localhost:8000 /
 Django版本:1.1
 Python版本:2.6.1

模板错误:
在/path/to/base.tpl模板中,第19行的错误
   在渲染时捕捉到exception:需要解压缩的值太多

 19:你好,{{user.username}}({{user.get_profile.rep}})。 近况如何? 登出


exceptiontypes:TemplateSyntaxError at /
exception值:渲染时遇到exception:需要解压缩的值太多

任何关于正在发生什么或我做错什么的想法?

这个exception意味着你正试图解开一个元组,但是这个元组的值相对于目标variables的数量来说太多了。 例如:这项工作,并打印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 

现在,为什么发生在你的情况下,我不知道,但也许这个答案会指向你在正确的方向。

尝试在一个variables中解包,

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 

这个问题看起来很熟悉,所以我想我会看到,如果我可以从有限的信息量复制。

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

引用博客条目:

该设置的值不是“appname.models.modelname”,它只是“appname.modelname”。 原因是Django不使用这个来直接导入; 相反,它使用了一个只需要应用程序名称和模型名称的内部模型加载函数。 尝试在AUTH_PROFILE_MODULE设置中执行诸如“appname.models.modelname”或“projectname.appname.models.modelname”之类的操作会导致Django炸毁可怕的“解包太多值”错误,所以确保你已经把“appname.modelname”放在AUTH_PROFILE_MODULE的值中。

如果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仍然有一些导入魔法的less数情况之一,当小错误不会引发预期的exception时,会导致混淆。

你可以在traceback结尾处看到,我发布了如何使用AUTH_PROFILE_MODULE格式“appname.modelname”以外的任何东西来引起行“app_label,model_name = settings.AUTH_PROFILE_MODULE.split('。')” “解包太多值”的错误。

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

get_profile()调用中很可能存在错误。 在你看来,在你返回请求对象之前,把这一行:

 request.user.get_profile() 

它应该提高错误,给你一个更详细的回溯,然后你可以使用它来进一步debugging。

当我使用Jinja2进行模板时,会发生这种情况。 这个问题可以通过使用django_extensions的runserver_plus命令来运行开发服务器来解决。

它使用werkzeugdebugging器,这也恰好是一个更好的,有一个非常好的交互式debugging控制台。 它在任何帧(在调用堆栈中)启动一个python shell,所以你可以debugging一些ajax魔术。