“解压缩太多值”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魔术。