使用额外选项反转Django URL

Jus*_*oss 13 python django

假设我有一个类似于下面的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


S.L*_*ott 7

这就是我们的工作.

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)