【问题标题】:How to use Django reverse in tests?如何在测试中使用 Django reverse?
【发布时间】:2018-07-19 01:55:33
【问题描述】:

我不知道如何在 django 中使用 reverse 函数。我明白了,

ValueError: dictionary update sequence element #0 has length 1; 2 is required

我可以直接硬编码正常工作的网址,但我想以标准方式进行。

主 urls.py

 urlpatterns = [
            url(r'^nmailadmin/', admin.site.urls),
            url(r'^api/v1/',include('Core.Login.urls',namespace='login')),
            url(r'^api/v1/mail/',include('Core.Mail.urls',namespace='mail')),
 ]

我已经为登录和邮件 API 提供了命名空间。

当我尝试访问这样的邮件网址时

def test_0list_folders(self):
    url = reverse('mail:folder_list', kwargs={'server':0})
    response = self.client.get('/api/v1/mail/folder_list/0/', follow=True)
    self.assertEqual(status.HTTP_200_OK, response.status_code)

我遇到这样的错误。

----------------------------------------------------------------------
Traceback (most recent call last):
  File "/home/next/PycharmProjects/Nmail/Nmail-Server/Core/Mail/tests.py", line 25, in test_0list_folders
    url = reverse('mail:folder_list', kwargs={'server':0})
  File "/home/next/venv/NmailVenv/lib/python3.6/site-packages/django/urls/base.py", line 91, in reverse
    return force_text(iri_to_uri(resolver._reverse_with_prefix(view, prefix, *args, **kwargs)))
  File "/home/next/venv/NmailVenv/lib/python3.6/site-packages/django/urls/resolvers.py", line 436, in _reverse_with_prefix
    self._populate()
  File "/home/next/venv/NmailVenv/lib/python3.6/site-packages/django/urls/resolvers.py", line 309, in _populate
    dict(defaults, **pattern.default_kwargs),
ValueError: dictionary update sequence element #0 has length 1; 2 is required

----------------------------------------------------------------------

这是我的邮件应用程序的 urls 文件。

urlpatterns = [
   url(r'folder_list/(?P<server>\d+)/$', folder_list,name='folder_list'),
   url(r'^auth_login/$', login_auth, name='auth_login'),
   url(r'viewmsg/(?P<server>\d+)/(?P<folder>.*?)/(?P<uid>\d+)/$', viewmsg, name='viewmsg'),
    url(r'action/(?P<action>.*?)/$', action, 'action'),
     ]

Django 版本:Django==1.11.7

【问题讨论】:

  • reverse('mail:auth_login') 引发的错误,但您显示的网址格式不同。列出mail命名空间中存在的所有url
  • 我已经更新了网址,请检查。
  • 还有 django 版本?
  • 我正在使用 Django==1.11.7

标签: python django dictionary reverse django-testing


【解决方案1】:

我的错。我实际上发现问题在于我的一个邮件应用程序的 urls.py

中缺少 kwarg 名称
urlpatterns = [
   url(r'folder_list/(?P<server>\d+)/$', folder_list,name='folder_list'),
   url(r'^auth_login/$', login_auth, name='auth_login'),
   url(r'viewmsg/(?P<server>\d+)/(?P<folder>.*?)/(?P<uid>\d+)/$', viewmsg, name='viewmsg'),
   url(r'action/(?P<action>.*?)/$', action, name='action'),
     ]

一切都很好。希望这对将来的人有所帮助。

P.S:答案Error: "dictionary update sequence element #0 has length 1; 2 is required" on Django 1.4已经指出了。

【讨论】:

    猜你喜欢
    • 2012-01-08
    • 2015-04-23
    • 2011-11-17
    • 1970-01-01
    • 2016-10-12
    • 2011-03-29
    • 1970-01-01
    • 2017-08-05
    • 2017-01-21
    相关资源
    最近更新 更多