如何在其上制作一个简单的 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)?