使用额外选项反转Django网址 [英] Reversing Django URLs With Extra Options

查看:129
本文介绍了使用额外选项反转Django网址的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

假设我有一个如下所示的URLconf,'foo''bar' page_slug

  urlpatterns = patterns('',
r'^ page /(?P< page_slug>。*)/','myapp.views.someview'),

然后,我可以使用下面的URL重建URL吗?

 >> ;>来自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'}),

我预计这个结果:

 >>>来自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'),



 >>>来自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文件


Suppose I have a URLconf like below, and 'foo' and 'bar' are valid values for page_slug.

urlpatterns = patterns('',
    (r'^page/(?P<page_slug>.*)/', 'myapp.views.someview'),
)

Then, I could reconstruct the URLs using the below, right?

>>> 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/'

But what if I change my URLconf to this?

urlpatterns = patterns('',
    (r'^foo-direct/', 'myapp.views.someview', {'page_slug': 'foo'}),
    (r'^my-bar-page/', 'myapp.views.someview', {'page_slug': 'bar'}),
)

I expected this result:

>>> 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/'

However, this throws a NoReverseMatch exception. I suspect I'm trying to do something impossible. Any suggestions on a saner way to accomplish what I want?

Named URLs aren't an option, since I don't want other apps that link to these to need to know about the specifics of the URL structure (encapsulation and all that).

解决方案

You should try naming your urlconfs. Example:

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'),
)

Then just edit your reverses and you should get it working.

>>> 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/'

More info at: Django Docs

这篇关于使用额外选项反转Django网址的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆