使用额外选项反转Django URL

时间:2009-03-18 19:45:59

标签: python django

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

urlpatterns = patterns('',
    (r'^page/(?P<page_slug>.*)/', '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结构的细节(封装和所有这些)。

3 个答案:

答案 0 :(得分:20)

您应该尝试命名您的urlconf。例如:

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

答案 1 :(得分:7)

这就是我们的工作。

urls.py有这样的模式

url(r'^(?P< datarealm >.*?)/json/someClass/(?P<object_id>.*?)/$', 'json_someClass_resource', ),

views.py作为此类反向调用

    object = SomeModel.objects.get(...)
    url= reverse('json_someClass_resource', kwargs={'object_id':object.id,'datarealm':object.datarealm.name})

答案 2 :(得分:4)

命名网址应该是一个选项。您的案例在Django参考中突出显示:

http://docs.djangoproject.com/en/dev/topics/http/urls/?from=olddocs#id2

我不确定设计师是否会选择另一种解决方案;他们希望有名的网址覆盖它。

我可以离题封装吗?谢谢。主要有两个原因:

  1. 抽象 - 没有人希望查看详情
  2. 安全性 - 没有人查看详情
  3. 对于1,你可以在python中获得相当多的里程数,而Django就是一个很好的例子。至于2,它是一种解释性语言。您要么在编写它的地方运行它,要么运送已编译的.pyc文件。如果这正是你正在做的事情,那么编译url conf。

    最后,让其他应用程序了解函数而不是url结构似乎更少封装。但如果你真的不同意,我认为你必须自己实施更灵活的反向方法。

相关问题