【问题标题】:Django urlresolvers: Need more than 2 values to unpackDjango urlresolvers:需要超过 2 个值才能解压
【发布时间】:2014-05-24 19:38:22
【问题描述】:

我正在尝试从 Django 1.3 升级到 Django 1.4。我被这个错误困住了:

Python 版本:2.7.3
Django 版本:1.4.10
异常类型:ValueError
异常值:需要超过 2 个值才能解压

触发该错误的行是(在模板 /var/www/proj/src_1.4/templates/fragments/header.html 中,第 20 行错误):

    <a id="login" href="{% url login %}" rel="nofollow">{% trans "Login" %}</a>

它在 Django 1.3 中运行良好。

我尝试了以下方法:

python manage.py shell
>> from django.conf.urls import *
>> from django.core.urlresolvers import reverse
>> reverse('login')

然后出现这个错误:

ValueError                                Traceback (most recent call last)
/var/www/proj/env_1.4/local/lib/python2.7/site-packages/django/core/management/commands/shell.pyc in <module>()
----> 1 reverse('login')

/var/www/proj/env_1.4/local/lib/python2.7/site-packages/django/core/urlresolvers.pyc in reverse(viewname, urlconf, args, kwargs, prefix, current_app)
474             resolver = get_ns_resolver(ns_pattern, resolver)
475 
--> 476     return iri_to_uri(resolver._reverse_with_prefix(view, prefix, *args, **kwargs))
477 
478 reverse_lazy = lazy(reverse, str)

/var/www/proj/env_1.4/local/lib/python2.7/site-packages/django/core/urlresolvers.pyc in _reverse_with_prefix(self, lookup_view, _prefix, *args, **kwargs)
363         possibilities = self.reverse_dict.getlist(lookup_view)
364         prefix_norm, prefix_args = normalize(_prefix)[0]
--> 365         for possibility, pattern, defaults in possibilities:
366             for result, params in possibility:
367                 if args:

ValueError: need more than 2 values to unpack

如果我在尝试加载项目时查看 Django 显示的信息,“Local vars”会显示该信息:

self    <RegexURLResolver urls (None:None) ^/>
args    ()
_prefix u'/'
possibilities   [([(u'accounts/login/', [])], 'accounts/login/$')]
lookup_view u'login'
prefix_norm u'/'
prefix_args []
kwargs  {}

proj/urls.py 中的代码

from django.conf.urls import *

urlpatterns += patterns('',
    url(r'^', include('home.urls')),                
    url(r'^admin/', include(admin.site.urls)),
    url(r'^accounts', include('accounts.urls')),

apps/accounts/urls.py 中的代码

from django.conf.urls import patterns, url

urlpatterns = patterns('',
url(r'^/register$',
    'accounts.views.register',
    name='register'),
url(r'^/login/$',
    'django.contrib.auth.views.login',
    {'template_name': 'accounts/login.html', 'authentication_form': AuthenticationForm},
    name='login'),

对此我将不胜感激。谢谢。

最后我发现了错误。这是一个用于 URL 国际化的旧应用程序 (i18nurls)。 Django 1.3 使用外部应用程序,在 Django > 1.4 中,国际化已包含在核心中 (Django: Internationalization: in URL patterns)。

谢谢。

【问题讨论】:

  • 当 python 期望显示更多值时,您会收到该错误,例如您有一个 print 语句:print("%s %s %s" % (var1, var2))。 Python 期望解压 3 个值,但只给出了两个
  • 感谢@aldux 的信息。我知道,但我不知道为什么 django 不能正常工作。
  • 由于一个简单的reverse('login') 设法触发问题,其原因很明显不是在您迄今为止发布的任何代码中。请发布您的urls.py 模块。
  • 我添加了新代码。谢谢。

标签: django


【解决方案1】:

如果这是您的完整 urls.py 代码

从 django.conf.urls 导入模式,url

urlpatterns = patterns('',
url(r'^/register$',
    'accounts.views.register',
    name='register'),
url(r'^/login/$',
    'django.contrib.auth.views.login',
    {'template_name': 'accounts/login.html', 'authentication_form': AuthenticationForm},
    name='login'),

检查你没有添加右括号)

从 django.conf.urls 导入模式,url

urlpatterns = patterns('',
url(r'^/register$',
    'accounts.views.register',
    name='register'),
url(r'^/login/$',
    'django.contrib.auth.views.login',
    {'template_name': 'accounts/login.html', 'authentication_form': AuthenticationForm},
    name='login'),
)

【讨论】:

    【解决方案2】:

    不确定这是否能解决您的错误,但请尝试执行以下操作: 在你的主要 url.py 替换

    url(r'^accounts', include('accounts.urls')),
    

    url(r'^accounts/', include('accounts.urls')), ### add the slash /
    

    最好将slash / 包含在外部 urlpatterns 中而不是内部。

    然后,在urls.py里面的accounts替换

    url(r'^/register$',...
    url(r'^/login/$',....
    

    url(r'^register/$',...   ### delete dhe leading slashed, because you added it in `accounts/`
    url(r'^login/$',....     ### finish both regex with the slash
    

    另一个建议是添加一个命名空间:

    url(r'^accounts/', include('accounts.urls', namespace='accounts')),
    

    现在使用"{% url 'accounts:login' %}" 引用您的模板

    通过这种方式,您将更好地了解哪个 url 来自哪个应用程序。检查这些提示是否修复了您的错误,如果没有,请告诉我

    【讨论】:

    • 感谢您的信息。我对代码进行了更改,但仍然出现相同的错误。我尝试在 django 1.3 和 1.4 中进行调试,问题出在第 365 行for possibility, pattern, defaults in possibilities:。可能性的值是:[([(u'accounts/login/', [])], u'accounts/login/$')],在 django 1.3 和 1.4 中。在 django 1.3 中没有问题,因为 for 循环只需要 2 个值:for possibility, pattern in possibilities:。问题是defaults 变量。 defaults 的期望值是多少?
    • 感谢@Mihai,我终于找到了问题所在,这是一个在 Django 1.3 中使用的旧国际化应用程序。
    猜你喜欢
    • 1970-01-01
    • 2014-01-18
    • 2020-07-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-29
    • 1970-01-01
    相关资源
    最近更新 更多