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