假设我有一个类似于下面的URLconf,'foo'
并且'bar'
是有效值page_slug
.
urlpatterns = patterns('', (r'^page/(?P.*)/', 'myapp.views.someview'), )
然后,我可以使用下面的方法重建URL,对吗?
>>> from django.core.urlresolvers import reverse >>> reverse('myapp.views.someview', kwargs={'page_slug': 'foo'}) '/page/foo/' >>> reverse('myapp.views.someview', kwargs={'page_slug': 'bar'}) '/page/bar/'
但是,如果我将URLconf更改为此怎么办?
urlpatterns = patterns('', (r'^foo-direct/', 'myapp.views.someview', {'page_slug': 'foo'}), (r'^my-bar-page/', 'myapp.views.someview', {'page_slug': 'bar'}), )
我期待这个结果:
>>> from django.core.urlresolvers import reverse >>> reverse('myapp.views.someview', kwargs={'page_slug': 'foo'}) '/foo-direct/' >>> reverse('myapp.views.someview', kwargs={'page_slug': 'bar'}) '/my-bar-page/'
但是,这会引发NoReverseMatch
异常.我怀疑我正在尝试做一些不可能的事情.有什么建议可以实现我想要的更好的方式吗?
命名URL不是一个选项,因为我不希望链接到这些的其他应用程序需要知道URL结构的细节(封装和所有这些).
你应该尝试命名你的urlconfs.例:
urlpatterns = patterns('', url(r'^foo-direct/', 'myapp.views.someview', {'page_slug': 'foo'}, name='foo-direct'), url(r'^my-bar-page/', 'myapp.views.someview', {'page_slug': 'bar'}, name='bar-page'), )
然后只需编辑你的反转,你应该让它工作.
>>> from django.core.urlresolvers import reverse >>> reverse('foo-direct', kwargs={'page_slug': 'foo'}) '/foo-direct/' >>> reverse('bar-page', kwargs={'page_slug': 'bar'}) '/my-bar-page/'
更多信息:Django Docs
这就是我们的工作.
urls.py有这样的模式
url(r'^(?P< datarealm >.*?)/json/someClass/(?P.*?)/$', 'json_someClass_resource', ),
views.py作为这样的反向调用
object = SomeModel.objects.get(...) url= reverse('json_someClass_resource', kwargs={'object_id':object.id,'datarealm':object.datarealm.name})