如何在其上制作一个简单的 Django URLconf 和 reverse() 进行测试? (获取TypeError:不可散列的类型:'list')

Posted

技术标签:

【中文标题】如何在其上制作一个简单的 Django URLconf 和 reverse() 进行测试? (获取TypeError:不可散列的类型:\'list\')【英文标题】:How to make a simple Django URLconf and reverse() on it for a test? (getting TypeError: unhashable type: 'list')如何在其上制作一个简单的 Django URLconf 和 reverse() 进行测试? (获取TypeError:不可散列的类型:'list') 【发布时间】:2013-06-14 21:23:55 【问题描述】:

我正在编写调用django.core.urlresolvers.reverse() 来生成链接的便捷代码。但是,我似乎无法写一个简单的URLconf 进行快速测试。

这是我尝试过的:

>>> from django.conf.urls import patterns, url
>>> conf = patterns('', url(r'^foo/$', lambda request: None, name='foo'))
>>> from django.core.urlresolvers import reverse
>>> reverse('foo', conf)
Traceback (most recent call last):
File "<console>", line 1, in <module>
File ".../env/local/lib/python2.7/site-packages/django/core/urlresolvers.py", line 445, in reverse
    resolver = get_resolver(urlconf)
File ".../env/local/lib/python2.7/site-packages/django/utils/functional.py", line 27, in wrapper
    if mem_args in cache:
TypeError: unhashable type: 'list'

我在 Python 2.7 上使用 Django 1.5。

【问题讨论】:

试试reverse('foo')。为什么要在其中传递 url conf 因为我不想搜索项目范围的 URLconf。我正在使用隔离的 URLconf 进行测试。 reverse('foo') 失败,因为我的项目中没有名为“foo”的 URL。 patterns 返回一个列表。你可能想循环通过它,或者做conf[0] @karthikr 只是给出了关于 RegEx 模式不包含模式的错误。 【参考方案1】:

我会考虑创建一个test_urls.py 模块

from django.conf.urls import patterns, include, url

urlpatterns = patterns('', url(r'^foo/$', lambda request: None, name='foo'))

然后在测试中调用reverse 时提供test_urls.py 的路径。

reverse('foo', 'path.to.test_urls')

如果你真的想在你的测试中创建urlconf,你需要确保它有一个urlpatterns 属性。以下适用于 Django 1.4。

from django.conf.urls import patterns, url
from django.core.urlresolvers import reverse

class MockUrlConf(object):
    urlpatterns = patterns('', url(r'^foo/$', lambda request: None, name='foo'))

reverse('foo', MockUrlConf)

【讨论】:

这太棒了!我不想创建一个test_urls.py,因为这对于一个 URL 来说似乎有点矫枉过正。但是内部类解决方案完美运行,谢谢!【参考方案2】:

reverse 方法的urlconf 参数是一个字符串,表示包含urls 的模块的名称。你可以这样称呼它:

reverse('foo', 'your_app.urls' )

现在,我不知道如何准确地改变这种行为,您可以创建一些 urls.py 来测试和调用它们,但这似乎与您的 settings.py 中的 URL 模块名称并不紧密。

文档不是很有用,它基本上说you won't need to set urlconf param。所以我会听它并尝试另一种方式。

祝你好运!

【讨论】:

这似乎是我在文档中四处寻找的答案,但 Alasdair 的答案也有效,并且有额外的好处,我不需要仅为单个测试 URL 创建文件.但我同意文档不是很有帮助! 我同意,Alasdair 的回答非常好。

以上是关于如何在其上制作一个简单的 Django URLconf 和 reverse() 进行测试? (获取TypeError:不可散列的类型:'list')的主要内容,如果未能解决你的问题,请参考以下文章

尝试制作一个按钮,因此如果玩家踩到它或在其上放置一个立方体,它会按下并打开一扇门

如何将 Sqlite 数据库文件复制/放入设备以在其上测试应用程序 - Xcode

如何创建空/空白 UIImage 或 CGImage 并在其上操作像素(Xcode)?

如何在查看器中使用 Autodesk.Viewing.MarkupsCore 扩展,以便我可以在其上绘图?

如何创建一个空垫并在其上画线?

如何在Android中创建一个在其上旋转的圆形进度条?