“有太多值需要解压缩”异常

我在 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


知道是怎么回事或者我做错了什么吗?

435086 次浏览

在 get _ profile ()调用中很可能存在错误。在您的视图中,在返回 request 对象之前,请输入以下代码行:

request.user.get_profile()

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

这个异常意味着您正在尝试解压缩一个 tuple,但是 tuple 在目标变量的数量方面有太多的值。例如: this 工作,并打印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

我不知道为什么会发生在你身上,但也许这个答案会给你指明正确的方向。

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

它使用了 沃克泽格调试器,这个调试器也比较好,并且有一个非常好的交互式调试控制台。它在 任何帧(在调用堆栈中)启动一个 python shell,这样您就可以进行调试了。

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

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

引用博客中的话:

该设置的值不是“ appname.mods.model name”,而是“ appname.model name”。原因是 Django 没有使用这个函数进行直接导入; 相反,它使用了一个内部模型加载函数,该函数只需要应用程序的名称和模型的名称。尝试在 AUTH _ PROFILE _ MODULE 设置中执行“ appname.model. model name”或“ projectname.appname.modname”之类的操作将导致 Django 出现可怕的“太多值无法解包”错误,因此请确保在 AUTH _ PROFILE _ MODULE 值中输入“ appname.model name”,而不是其他任何内容。

如果 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.model name”之外的任何形式,将导致行“ app _ label,model _ name = setings.AUTH _ PROFILE _ MODULE。Split (’.’)”引发“太多值无法解压缩”错误。

我百分之九十九肯定这是最初遇到的问题。

尝试在一个变量中解包,

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

忘记 列举试图去 循环访问 index

投掷 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]