I am writing convenience code which calls django.core.urlresolvers.reverse()
to generate links. However, I can't seem to write a simple URLconf for a quick test.
This is what I tried:
>>> 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'
I'm using Django 1.5 on Python 2.7.
I would consider creating a test_urls.py
module
from django.conf.urls import patterns, include, url
urlpatterns = patterns('', url(r'^foo/$', lambda request: None, name='foo'))
then give the path to test_urls.py
when you call reverse
in your test.
reverse('foo', 'path.to.test_urls')
If you really want to create the urlconf
in your test, you need to make sure it has a urlpatterns
attribute. The following works in 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)
reverse
method's urlconf
param is a string indicating the name of the module containing the urls
. You may call it like this:
reverse('foo', 'your_app.urls' )
Now, I don't know how exactly change this behavior, you may create some urls.py
for testing and calling them, but this seems hardly tight to the URL modules names in your settings.py
.
The documentation isn-t very useful, it says basically you won't need to set urlconf
param. So I would listen to it and try another way.
Good luck!
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With