簡體   English   中英

使用額外選項反轉 Django URL

[英]Reversing Django URLs With Extra Options

假設我有一個如下所示的 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 結構(封裝和所有這些)的細節。

您應該嘗試命名您的 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 文檔

這就是我們所做的。

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})

命名網址應該是一個選項。 您的案例在 Django 參考中突出顯示:

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

我不確定設計師是否留下了另一種解決方法。 他們希望命名的網址能夠覆蓋它。

我可以離題一下封裝嗎? 謝謝。 主要原因有兩個:

  1. 抽象——沒有人願意看到細節
  2. 安全性——任何人都不應看到細節

至於1,你可以在python中獲得相當多的里程,Django就是一個很好的例子。 至於2,它是一種解釋語言。 要么你在它寫的地方運行它,要么你正在運送已編譯的.pyc 文件。 如果這真的是你正在做的,那么編譯 url conf。

最后,與 url 結構相比,讓其他應用了解功能似乎更少封裝。 但如果你真的不同意,我認為你必須自己實現一個更靈活的反向方法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM